Commit 78a7ace4 authored by Evan Stade's avatar Evan Stade Committed by Commit Bot

Remove ApplicationStatus usage from PhotoPicker.

ApplicationStatus only works in //chrome. See crbug.com/470582

Bug: 1110930
Change-Id: I71a6a5701aa40434588830cfcc6dee8ff6f5143a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2378633Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Reviewed-by: default avatarFinnur Thorarinsson <finnur@chromium.org>
Commit-Queue: Evan Stade <estade@chromium.org>
Cr-Commit-Position: refs/heads/master@{#803247}
parent 33f8dfb0
...@@ -95,6 +95,7 @@ import org.chromium.content_public.common.ContentSwitches; ...@@ -95,6 +95,7 @@ import org.chromium.content_public.common.ContentSwitches;
import org.chromium.ui.ContactsPickerListener; import org.chromium.ui.ContactsPickerListener;
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.PhotoPicker;
import org.chromium.ui.base.PhotoPickerDelegate; import org.chromium.ui.base.PhotoPickerDelegate;
import org.chromium.ui.base.PhotoPickerListener; import org.chromium.ui.base.PhotoPickerListener;
import org.chromium.ui.base.SelectFileDialog; import org.chromium.ui.base.SelectFileDialog;
...@@ -216,23 +217,17 @@ public class ProcessInitializationHandler { ...@@ -216,23 +217,17 @@ public class ProcessInitializationHandler {
if (ChromeFeatureList.isEnabled(ChromeFeatureList.NEW_PHOTO_PICKER)) { if (ChromeFeatureList.isEnabled(ChromeFeatureList.NEW_PHOTO_PICKER)) {
SelectFileDialog.setPhotoPickerDelegate(new PhotoPickerDelegate() { SelectFileDialog.setPhotoPickerDelegate(new PhotoPickerDelegate() {
private PhotoPickerDialog mDialog;
@Override @Override
public void showPhotoPicker(WindowAndroid windowAndroid, public PhotoPicker showPhotoPicker(WindowAndroid windowAndroid,
PhotoPickerListener listener, boolean allowMultiple, PhotoPickerListener listener, boolean allowMultiple,
List<String> mimeTypes) { List<String> mimeTypes) {
mDialog = new PhotoPickerDialog(windowAndroid, PhotoPickerDialog dialog = new PhotoPickerDialog(windowAndroid,
windowAndroid.getContext().get().getContentResolver(), listener, windowAndroid.getContext().get().getContentResolver(), listener,
allowMultiple, mimeTypes, new VrModeProviderImpl()); allowMultiple, mimeTypes, new VrModeProviderImpl());
mDialog.getWindow().getAttributes().windowAnimations = dialog.getWindow().getAttributes().windowAnimations =
R.style.PickerDialogAnimation; R.style.PickerDialogAnimation;
mDialog.show(); dialog.show();
} return dialog;
@Override
public void onPhotoPickerDismissed() {
mDialog = null;
} }
@Override @Override
......
...@@ -4,18 +4,15 @@ ...@@ -4,18 +4,15 @@
package org.chromium.components.browser_ui.photo_picker; package org.chromium.components.browser_ui.photo_picker;
import android.app.Activity;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.net.Uri; import android.net.Uri;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import org.chromium.base.ActivityState; import org.chromium.ui.base.PhotoPicker;
import org.chromium.base.ApplicationStatus;
import org.chromium.base.ApplicationStatus.ActivityStateListener;
import org.chromium.base.ContextUtils;
import org.chromium.ui.base.PhotoPickerListener; import org.chromium.ui.base.PhotoPickerListener;
import org.chromium.ui.base.SelectFileDialog;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.vr.VrModeProvider; import org.chromium.ui.vr.VrModeProvider;
...@@ -26,7 +23,7 @@ import java.util.List; ...@@ -26,7 +23,7 @@ import java.util.List;
* &lt;input type=file accept=image &gt; form element. * &lt;input type=file accept=image &gt; form element.
*/ */
public class PhotoPickerDialog public class PhotoPickerDialog
extends AlertDialog implements PhotoPickerToolbar.PhotoPickerToolbarDelegate { extends AlertDialog implements PhotoPickerToolbar.PhotoPickerToolbarDelegate, PhotoPicker {
// Our window. // Our window.
private WindowAndroid mWindowAndroid; private WindowAndroid mWindowAndroid;
...@@ -118,23 +115,7 @@ public class PhotoPickerDialog ...@@ -118,23 +115,7 @@ public class PhotoPickerDialog
if (!mListenerWrapper.externalIntentSelected() || mDoneWaitingForExternalIntent) { if (!mListenerWrapper.externalIntentSelected() || mDoneWaitingForExternalIntent) {
super.dismiss(); super.dismiss();
mCategoryView.onDialogDismissed(); mCategoryView.onDialogDismissed();
} else { SelectFileDialog.onPhotoPickerDismissed();
ApplicationStatus.registerStateListenerForActivity(new ActivityStateListener() {
@Override
public void onActivityStateChange(Activity activity, int newState) {
// When an external intent, such as the Camera intent, is launched, this
// listener will first receive the PAUSED event. Normally, STOPPED is the next
// event, as the Camera intent appears. But if the user presses Back quickly
// after the PAUSED event, the STOPPED event will not arrive, and this listener
// gets RESUMED instead. However, we are already in teardown mode, so the
// safe thing to do is to close the dialog.
if (newState == ActivityState.STOPPED || newState == ActivityState.RESUMED) {
mDoneWaitingForExternalIntent = true;
ApplicationStatus.unregisterActivityStateListener(this);
dismiss();
}
}
}, ContextUtils.activityFromContext(mWindowAndroid.getContext().get()));
} }
} }
...@@ -146,6 +127,14 @@ public class PhotoPickerDialog ...@@ -146,6 +127,14 @@ public class PhotoPickerDialog
cancel(); cancel();
} }
// PhotoPicker:
@Override
public void onExternalIntentCompleted() {
mDoneWaitingForExternalIntent = true;
dismiss();
}
@VisibleForTesting @VisibleForTesting
public PickerCategoryView getCategoryViewForTesting() { public PickerCategoryView getCategoryViewForTesting() {
return mCategoryView; return mCategoryView;
......
...@@ -37,7 +37,6 @@ import org.chromium.components.browser_ui.widget.selectable_list.SelectableListL ...@@ -37,7 +37,6 @@ import org.chromium.components.browser_ui.widget.selectable_list.SelectableListL
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.base.PhotoPickerListener; import org.chromium.ui.base.PhotoPickerListener;
import org.chromium.ui.base.SelectFileDialog;
import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.vr.VrModeProvider; import org.chromium.ui.vr.VrModeProvider;
...@@ -278,6 +277,8 @@ public class PickerCategoryView extends RelativeLayout ...@@ -278,6 +277,8 @@ public class PickerCategoryView extends RelativeLayout
mDecoderServiceHost.unbind(mWindowAndroid.getContext().get()); mDecoderServiceHost.unbind(mWindowAndroid.getContext().get());
mDecoderServiceHost = null; mDecoderServiceHost = null;
} }
mDialog = null;
} }
/** /**
...@@ -285,6 +286,7 @@ public class PickerCategoryView extends RelativeLayout ...@@ -285,6 +286,7 @@ public class PickerCategoryView extends RelativeLayout
* @param uri The uri of the video to start playing. * @param uri The uri of the video to start playing.
*/ */
public void startVideoPlaybackAsync(Uri uri) { public void startVideoPlaybackAsync(Uri uri) {
if (mDialog == null) return;
mVideoPlayer.startVideoPlaybackAsync(uri, mDialog.getWindow().getDecorView()); mVideoPlayer.startVideoPlaybackAsync(uri, mDialog.getWindow().getDecorView());
} }
...@@ -640,8 +642,7 @@ public class PickerCategoryView extends RelativeLayout ...@@ -640,8 +642,7 @@ public class PickerCategoryView extends RelativeLayout
private void executeAction( private void executeAction(
@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(); if (mDialog != null) mDialog.dismiss();
SelectFileDialog.onPhotoPickerDismissed();
recordFinalUmaStats(umaId); recordFinalUmaStats(umaId);
} }
......
...@@ -255,6 +255,7 @@ android_library("ui_no_recycler_view_java") { ...@@ -255,6 +255,7 @@ android_library("ui_no_recycler_view_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/PhotoPicker.java",
"java/src/org/chromium/ui/base/PhotoPickerDelegate.java", "java/src/org/chromium/ui/base/PhotoPickerDelegate.java",
"java/src/org/chromium/ui/base/PhotoPickerListener.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",
......
// 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;
/**
* An interface for the custom image file picker.
* See {@link SelectFileDialog}.
*/
public interface PhotoPicker {
/**
* Called after use of the PhotoPicker results in an external intent.
* When the PhotoPicker is used to choose the camera, for example, {@link SelectFileDialog} will
* launch a camera intent. When that intent is done, this will be called. This allows the
* PhotoPicker to defer dismissing until the Camera intent has been shown and completed.
*/
void onExternalIntentCompleted();
}
...@@ -15,15 +15,11 @@ public interface PhotoPickerDelegate { ...@@ -15,15 +15,11 @@ public interface PhotoPickerDelegate {
* picker. * picker.
* @param allowMultiple Whether the dialog should allow multiple images to be selected. * @param allowMultiple Whether the dialog should allow multiple images to be 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.
* @return the PhotoPicker object.
*/ */
void showPhotoPicker(WindowAndroid windowAndroid, PhotoPickerListener listener, PhotoPicker showPhotoPicker(WindowAndroid windowAndroid, PhotoPickerListener listener,
boolean allowMultiple, List<String> mimeTypes); 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. * Returns whether video decoding support is supported in the photo picker.
*/ */
......
...@@ -115,6 +115,9 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick ...@@ -115,6 +115,9 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick
/** A delegate for the photo picker. */ /** A delegate for the photo picker. */
private static PhotoPickerDelegate sPhotoPickerDelegate; private static PhotoPickerDelegate sPhotoPickerDelegate;
/** The active photo picker, or null if none is active. */
private static PhotoPicker sPhotoPicker;
/** /**
* Allows setting a delegate to override the default Android stock photo picker. * Allows setting a delegate to override the default Android stock photo picker.
* @param delegate A {@link PhotoPickerDelegate} instance. * @param delegate A {@link PhotoPickerDelegate} instance.
...@@ -127,8 +130,8 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick ...@@ -127,8 +130,8 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick
* Called when the photo picker dialog has been dismissed. * Called when the photo picker dialog has been dismissed.
*/ */
public static void onPhotoPickerDismissed() { public static void onPhotoPickerDismissed() {
if (sPhotoPickerDelegate == null) return; assert sPhotoPicker != null;
sPhotoPickerDelegate.onPhotoPickerDismissed(); sPhotoPicker = null;
} }
SelectFileDialog(long nativeSelectFileDialog) { SelectFileDialog(long nativeSelectFileDialog) {
...@@ -508,6 +511,8 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick ...@@ -508,6 +511,8 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick
return photoFile; return photoFile;
} }
// WindowAndroid.IntentCallback:
/** /**
* Callback method to handle the intent results and pass on the path to the native * Callback method to handle the intent results and pass on the path to the native
* SelectFileDialog. * SelectFileDialog.
...@@ -518,6 +523,10 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick ...@@ -518,6 +523,10 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
@Override @Override
public void onIntentCompleted(WindowAndroid window, int resultCode, Intent results) { public void onIntentCompleted(WindowAndroid window, int resultCode, Intent results) {
if (sPhotoPicker != null) {
sPhotoPicker.onExternalIntentCompleted();
}
if (resultCode != Activity.RESULT_OK) { if (resultCode != Activity.RESULT_OK) {
onFileNotSelected(); onFileNotSelected();
return; return;
...@@ -857,7 +866,9 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick ...@@ -857,7 +866,9 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick
private static boolean showPhotoPicker(WindowAndroid windowAndroid, private static boolean showPhotoPicker(WindowAndroid windowAndroid,
PhotoPickerListener listener, boolean allowMultiple, List<String> mimeTypes) { PhotoPickerListener listener, boolean allowMultiple, List<String> mimeTypes) {
if (sPhotoPickerDelegate == null) return false; if (sPhotoPickerDelegate == null) return false;
sPhotoPickerDelegate.showPhotoPicker(windowAndroid, listener, allowMultiple, mimeTypes); assert sPhotoPicker == null;
sPhotoPicker = sPhotoPickerDelegate.showPhotoPicker(
windowAndroid, listener, allowMultiple, mimeTypes);
return true; return true;
} }
......
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