Commit ad57ab9b authored by Gang Wu's avatar Gang Wu Committed by Commit Bot

Revert "Remove ApplicationStatus usage from PhotoPicker."

This reverts commit 78a7ace4.

Reason for revert: 
This CL make PhotoPickerDialogTest flaky
https://test-results.appspot.com/dashboards/flakiness_dashboard.html#testType=chrome_public_test_apk&tests=org.chromium.components.browser_ui.photo_picker.PhotoPickerDialogTest%23*

Original change's description:
> 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/+/2378633
> Reviewed-by: David Trainor <dtrainor@chromium.org>
> Reviewed-by: Finnur Thorarinsson <finnur@chromium.org>
> Commit-Queue: Evan Stade <estade@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#803247}

TBR=finnur@chromium.org,dtrainor@chromium.org,estade@chromium.org

Change-Id: I78eaf08ba277d516584ae75d38ce64909ba36bff
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: 1110930
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2387196Reviewed-by: default avatarGang Wu <gangwu@chromium.org>
Commit-Queue: Gang Wu <gangwu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#803357}
parent 5989b154
...@@ -95,7 +95,6 @@ import org.chromium.content_public.common.ContentSwitches; ...@@ -95,7 +95,6 @@ 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;
...@@ -217,17 +216,23 @@ public class ProcessInitializationHandler { ...@@ -217,17 +216,23 @@ 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 PhotoPicker showPhotoPicker(WindowAndroid windowAndroid, public void showPhotoPicker(WindowAndroid windowAndroid,
PhotoPickerListener listener, boolean allowMultiple, PhotoPickerListener listener, boolean allowMultiple,
List<String> mimeTypes) { List<String> mimeTypes) {
PhotoPickerDialog dialog = new PhotoPickerDialog(windowAndroid, mDialog = new PhotoPickerDialog(windowAndroid,
windowAndroid.getContext().get().getContentResolver(), listener, windowAndroid.getContext().get().getContentResolver(), listener,
allowMultiple, mimeTypes, new VrModeProviderImpl()); allowMultiple, mimeTypes, new VrModeProviderImpl());
dialog.getWindow().getAttributes().windowAnimations = mDialog.getWindow().getAttributes().windowAnimations =
R.style.PickerDialogAnimation; R.style.PickerDialogAnimation;
dialog.show(); mDialog.show();
return dialog; }
@Override
public void onPhotoPickerDismissed() {
mDialog = null;
} }
@Override @Override
......
...@@ -4,15 +4,18 @@ ...@@ -4,15 +4,18 @@
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.ui.base.PhotoPicker; import org.chromium.base.ActivityState;
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;
...@@ -23,7 +26,7 @@ import java.util.List; ...@@ -23,7 +26,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, PhotoPicker { extends AlertDialog implements PhotoPickerToolbar.PhotoPickerToolbarDelegate {
// Our window. // Our window.
private WindowAndroid mWindowAndroid; private WindowAndroid mWindowAndroid;
...@@ -115,7 +118,23 @@ public class PhotoPickerDialog ...@@ -115,7 +118,23 @@ public class PhotoPickerDialog
if (!mListenerWrapper.externalIntentSelected() || mDoneWaitingForExternalIntent) { if (!mListenerWrapper.externalIntentSelected() || mDoneWaitingForExternalIntent) {
super.dismiss(); super.dismiss();
mCategoryView.onDialogDismissed(); mCategoryView.onDialogDismissed();
SelectFileDialog.onPhotoPickerDismissed(); } else {
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()));
} }
} }
...@@ -127,14 +146,6 @@ public class PhotoPickerDialog ...@@ -127,14 +146,6 @@ 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,6 +37,7 @@ import org.chromium.components.browser_ui.widget.selectable_list.SelectableListL ...@@ -37,6 +37,7 @@ 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;
...@@ -277,8 +278,6 @@ public class PickerCategoryView extends RelativeLayout ...@@ -277,8 +278,6 @@ public class PickerCategoryView extends RelativeLayout
mDecoderServiceHost.unbind(mWindowAndroid.getContext().get()); mDecoderServiceHost.unbind(mWindowAndroid.getContext().get());
mDecoderServiceHost = null; mDecoderServiceHost = null;
} }
mDialog = null;
} }
/** /**
...@@ -286,7 +285,6 @@ public class PickerCategoryView extends RelativeLayout ...@@ -286,7 +285,6 @@ 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());
} }
...@@ -642,7 +640,8 @@ public class PickerCategoryView extends RelativeLayout ...@@ -642,7 +640,8 @@ 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);
if (mDialog != null) mDialog.dismiss(); mDialog.dismiss();
SelectFileDialog.onPhotoPickerDismissed();
recordFinalUmaStats(umaId); recordFinalUmaStats(umaId);
} }
......
...@@ -255,7 +255,6 @@ android_library("ui_no_recycler_view_java") { ...@@ -255,7 +255,6 @@ 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,11 +15,15 @@ public interface PhotoPickerDelegate { ...@@ -15,11 +15,15 @@ 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.
*/ */
PhotoPicker showPhotoPicker(WindowAndroid windowAndroid, PhotoPickerListener listener, void 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,9 +115,6 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick ...@@ -115,9 +115,6 @@ 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.
...@@ -130,8 +127,8 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick ...@@ -130,8 +127,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() {
assert sPhotoPicker != null; if (sPhotoPickerDelegate == null) return;
sPhotoPicker = null; sPhotoPickerDelegate.onPhotoPickerDismissed();
} }
SelectFileDialog(long nativeSelectFileDialog) { SelectFileDialog(long nativeSelectFileDialog) {
...@@ -511,8 +508,6 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick ...@@ -511,8 +508,6 @@ 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.
...@@ -523,10 +518,6 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick ...@@ -523,10 +518,6 @@ 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;
...@@ -866,9 +857,7 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick ...@@ -866,9 +857,7 @@ 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;
assert sPhotoPicker == null; sPhotoPickerDelegate.showPhotoPicker(windowAndroid, listener, allowMultiple, mimeTypes);
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