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;
import org.chromium.ui.ContactsPickerListener;
import org.chromium.ui.UiUtils;
import org.chromium.ui.base.Clipboard;
import org.chromium.ui.base.PhotoPicker;
import org.chromium.ui.base.PhotoPickerDelegate;
import org.chromium.ui.base.PhotoPickerListener;
import org.chromium.ui.base.SelectFileDialog;
......@@ -217,17 +216,23 @@ public class ProcessInitializationHandler {
if (ChromeFeatureList.isEnabled(ChromeFeatureList.NEW_PHOTO_PICKER)) {
SelectFileDialog.setPhotoPickerDelegate(new PhotoPickerDelegate() {
private PhotoPickerDialog mDialog;
@Override
public PhotoPicker showPhotoPicker(WindowAndroid windowAndroid,
public void showPhotoPicker(WindowAndroid windowAndroid,
PhotoPickerListener listener, boolean allowMultiple,
List<String> mimeTypes) {
PhotoPickerDialog dialog = new PhotoPickerDialog(windowAndroid,
mDialog = new PhotoPickerDialog(windowAndroid,
windowAndroid.getContext().get().getContentResolver(), listener,
allowMultiple, mimeTypes, new VrModeProviderImpl());
dialog.getWindow().getAttributes().windowAnimations =
mDialog.getWindow().getAttributes().windowAnimations =
R.style.PickerDialogAnimation;
dialog.show();
return dialog;
mDialog.show();
}
@Override
public void onPhotoPickerDismissed() {
mDialog = null;
}
@Override
......
......@@ -4,15 +4,18 @@
package org.chromium.components.browser_ui.photo_picker;
import android.app.Activity;
import android.content.ContentResolver;
import android.net.Uri;
import androidx.annotation.VisibleForTesting;
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.SelectFileDialog;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.vr.VrModeProvider;
......@@ -23,7 +26,7 @@ import java.util.List;
* &lt;input type=file accept=image &gt; form element.
*/
public class PhotoPickerDialog
extends AlertDialog implements PhotoPickerToolbar.PhotoPickerToolbarDelegate, PhotoPicker {
extends AlertDialog implements PhotoPickerToolbar.PhotoPickerToolbarDelegate {
// Our window.
private WindowAndroid mWindowAndroid;
......@@ -115,7 +118,23 @@ public class PhotoPickerDialog
if (!mListenerWrapper.externalIntentSelected() || mDoneWaitingForExternalIntent) {
super.dismiss();
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
cancel();
}
// PhotoPicker:
@Override
public void onExternalIntentCompleted() {
mDoneWaitingForExternalIntent = true;
dismiss();
}
@VisibleForTesting
public PickerCategoryView getCategoryViewForTesting() {
return mCategoryView;
......
......@@ -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.net.MimeTypeFilter;
import org.chromium.ui.base.PhotoPickerListener;
import org.chromium.ui.base.SelectFileDialog;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.ui.vr.VrModeProvider;
......@@ -277,8 +278,6 @@ public class PickerCategoryView extends RelativeLayout
mDecoderServiceHost.unbind(mWindowAndroid.getContext().get());
mDecoderServiceHost = null;
}
mDialog = null;
}
/**
......@@ -286,7 +285,6 @@ public class PickerCategoryView extends RelativeLayout
* @param uri The uri of the video to start playing.
*/
public void startVideoPlaybackAsync(Uri uri) {
if (mDialog == null) return;
mVideoPlayer.startVideoPlaybackAsync(uri, mDialog.getWindow().getDecorView());
}
......@@ -642,7 +640,8 @@ public class PickerCategoryView extends RelativeLayout
private void executeAction(
@PhotoPickerListener.PhotoPickerAction int action, Uri[] photos, int umaId) {
mListener.onPhotoPickerUserAction(action, photos);
if (mDialog != null) mDialog.dismiss();
mDialog.dismiss();
SelectFileDialog.onPhotoPickerDismissed();
recordFinalUmaStats(umaId);
}
......
......@@ -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/LocalizationUtils.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/PhotoPickerListener.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 {
* 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.
* @return the PhotoPicker object.
*/
PhotoPicker showPhotoPicker(WindowAndroid windowAndroid, PhotoPickerListener listener,
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.
*/
......
......@@ -115,9 +115,6 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick
/** A delegate for the photo picker. */
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.
* @param delegate A {@link PhotoPickerDelegate} instance.
......@@ -130,8 +127,8 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick
* Called when the photo picker dialog has been dismissed.
*/
public static void onPhotoPickerDismissed() {
assert sPhotoPicker != null;
sPhotoPicker = null;
if (sPhotoPickerDelegate == null) return;
sPhotoPickerDelegate.onPhotoPickerDismissed();
}
SelectFileDialog(long nativeSelectFileDialog) {
......@@ -511,8 +508,6 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick
return photoFile;
}
// WindowAndroid.IntentCallback:
/**
* Callback method to handle the intent results and pass on the path to the native
* SelectFileDialog.
......@@ -523,10 +518,6 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
@Override
public void onIntentCompleted(WindowAndroid window, int resultCode, Intent results) {
if (sPhotoPicker != null) {
sPhotoPicker.onExternalIntentCompleted();
}
if (resultCode != Activity.RESULT_OK) {
onFileNotSelected();
return;
......@@ -866,9 +857,7 @@ public class SelectFileDialog implements WindowAndroid.IntentCallback, PhotoPick
private static boolean showPhotoPicker(WindowAndroid windowAndroid,
PhotoPickerListener listener, boolean allowMultiple, List<String> mimeTypes) {
if (sPhotoPickerDelegate == null) return false;
assert sPhotoPicker == null;
sPhotoPicker = sPhotoPickerDelegate.showPhotoPicker(
windowAndroid, listener, allowMultiple, mimeTypes);
sPhotoPickerDelegate.showPhotoPicker(windowAndroid, listener, allowMultiple, mimeTypes);
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