Commit 9ad464ef authored by sczs's avatar sczs Committed by Commit Bot

[ios] Adds support for a high priority Infobar presentation.

Some ConfirmInfobars like Restore tabs are important enough that we
don't want some users to miss them. Either because they are not presented
because some other Infobar is being presented, or because they time out
before the user has seen it.

This CL adds a BOOL flag to InfobarCoordinator, which InfobarContainerCoordinator
will use in order to add that Infobar's banner to the top of the queue and display
it for a bit longer.

I didn't want to create a more granular system since this might be temporary until
we migrate some of these Infobars to alerts or something similar, and its also
not currently needed.

Bug: 961343
Change-Id: Icf03748ec50b63bd9c99ead96ccae5c7fc644b0c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1828237Reviewed-by: default avatarPeter Lee <pkl@chromium.org>
Reviewed-by: default avatarChris Lu <thegreenfrog@chromium.org>
Commit-Queue: Sergio Collazos <sczs@chromium.org>
Cr-Commit-Position: refs/heads/master@{#701261}
parent 85a4df5d
...@@ -62,6 +62,7 @@ source_set("crash_report_internal") { ...@@ -62,6 +62,7 @@ source_set("crash_report_internal") {
"//ios/chrome/browser/infobars", "//ios/chrome/browser/infobars",
"//ios/chrome/browser/sessions", "//ios/chrome/browser/sessions",
"//ios/chrome/browser/sessions:serialisation", "//ios/chrome/browser/sessions:serialisation",
"//ios/chrome/browser/ui/infobars:feature_flags",
"//ios/chrome/browser/web:tab_id_tab_helper", "//ios/chrome/browser/web:tab_id_tab_helper",
"//ios/chrome/browser/web_state_list", "//ios/chrome/browser/web_state_list",
"//ios/web", "//ios/web",
......
...@@ -20,11 +20,13 @@ ...@@ -20,11 +20,13 @@
#include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#import "ios/chrome/browser/crash_report/breakpad_helper.h" #import "ios/chrome/browser/crash_report/breakpad_helper.h"
#include "ios/chrome/browser/infobars/infobar_manager_impl.h" #include "ios/chrome/browser/infobars/infobar_manager_impl.h"
#include "ios/chrome/browser/infobars/infobar_utils.h"
#include "ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.h" #include "ios/chrome/browser/sessions/ios_chrome_tab_restore_service_factory.h"
#import "ios/chrome/browser/sessions/session_ios.h" #import "ios/chrome/browser/sessions/session_ios.h"
#import "ios/chrome/browser/sessions/session_service_ios.h" #import "ios/chrome/browser/sessions/session_service_ios.h"
#import "ios/chrome/browser/sessions/session_window_ios.h" #import "ios/chrome/browser/sessions/session_window_ios.h"
#import "ios/chrome/browser/sessions/session_window_restoring.h" #import "ios/chrome/browser/sessions/session_window_restoring.h"
#import "ios/chrome/browser/ui/infobars/infobar_feature.h"
#include "ios/chrome/browser/web_state_list/web_state_list.h" #include "ios/chrome/browser/web_state_list/web_state_list.h"
#include "ios/chrome/grit/ios_theme_resources.h" #include "ios/chrome/grit/ios_theme_resources.h"
#import "ios/web/public/web_state.h" #import "ios/web/public/web_state.h"
...@@ -133,8 +135,14 @@ bool SessionCrashedInfoBarDelegate::Create( ...@@ -133,8 +135,14 @@ bool SessionCrashedInfoBarDelegate::Create(
DCHECK(infobar_manager); DCHECK(infobar_manager);
std::unique_ptr<ConfirmInfoBarDelegate> delegate( std::unique_ptr<ConfirmInfoBarDelegate> delegate(
new SessionCrashedInfoBarDelegate(crash_restore_helper)); new SessionCrashedInfoBarDelegate(crash_restore_helper));
return !!infobar_manager->AddInfoBar(
infobar_manager->CreateConfirmInfoBar(std::move(delegate))); if (IsInfobarUIRebootEnabled()) {
return !!infobar_manager->AddInfoBar(
::CreateHighPriorityConfirmInfoBar(std::move(delegate)));
} else {
return !!infobar_manager->AddInfoBar(
::CreateConfirmInfoBar(std::move(delegate)));
}
} }
infobars::InfoBarDelegate::InfoBarIdentifier infobars::InfoBarDelegate::InfoBarIdentifier
......
...@@ -18,4 +18,11 @@ class InfoBar; ...@@ -18,4 +18,11 @@ class InfoBar;
std::unique_ptr<infobars::InfoBar> CreateConfirmInfoBar( std::unique_ptr<infobars::InfoBar> CreateConfirmInfoBar(
std::unique_ptr<ConfirmInfoBarDelegate> delegate); std::unique_ptr<ConfirmInfoBarDelegate> delegate);
// Returns a confirm infobar with high priority presentation that owns
// |delegate|.
// TODO (crbug.com/961343):Reassess this method once there's more clarity on how
// to handle queueing and if priorities are actually needed.
std::unique_ptr<infobars::InfoBar> CreateHighPriorityConfirmInfoBar(
std::unique_ptr<ConfirmInfoBarDelegate> delegate);
#endif // IOS_CHROME_BROWSER_INFOBARS_INFOBAR_UTILS_H_ #endif // IOS_CHROME_BROWSER_INFOBARS_INFOBAR_UTILS_H_
...@@ -37,3 +37,17 @@ std::unique_ptr<infobars::InfoBar> CreateConfirmInfoBar( ...@@ -37,3 +37,17 @@ std::unique_ptr<infobars::InfoBar> CreateConfirmInfoBar(
return std::make_unique<InfoBarIOS>(controller, std::move(delegate)); return std::make_unique<InfoBarIOS>(controller, std::move(delegate));
} }
} }
std::unique_ptr<infobars::InfoBar> CreateHighPriorityConfirmInfoBar(
std::unique_ptr<ConfirmInfoBarDelegate> delegate) {
DCHECK(IsInfobarUIRebootEnabled());
// TODO(crbug.com/927064): Coordinators shouldn't be created at this level,
// we should probably send only the delegate and have the presenting
// Coordinator create the right Coordinator using that delegate.
InfobarConfirmCoordinator* coordinator = [[InfobarConfirmCoordinator alloc]
initWithInfoBarDelegate:delegate.get()
badgeSupport:NO
type:InfobarType::kInfobarTypeConfirm];
coordinator.highPriorityPresentation = YES;
return std::make_unique<InfoBarIOS>(coordinator, std::move(delegate));
}
...@@ -116,6 +116,13 @@ enum class InfobarBannerPresentationState; ...@@ -116,6 +116,13 @@ enum class InfobarBannerPresentationState;
// YES if the banner has ever been presented for this Coordinator. // YES if the banner has ever been presented for this Coordinator.
@property(nonatomic, assign, readonly) BOOL bannerWasPresented; @property(nonatomic, assign, readonly) BOOL bannerWasPresented;
// If YES this Coordinator's banner will have a higher presentation priority
// than other InfobarCoordinators with this property set to NO. The parent
// Coordinator will define what this means e.g. Longer presentation time before
// auto-dismiss and/or jumping the queue and being the next banner to present,
// etc.
@property(nonatomic, assign) BOOL highPriorityPresentation;
@end @end
#endif // IOS_CHROME_BROWSER_UI_INFOBARS_COORDINATORS_INFOBAR_COORDINATOR_H_ #endif // IOS_CHROME_BROWSER_UI_INFOBARS_COORDINATORS_INFOBAR_COORDINATOR_H_
...@@ -15,6 +15,9 @@ extern NSString* const kConfirmInfobarButton2AccessibilityIdentifier; ...@@ -15,6 +15,9 @@ extern NSString* const kConfirmInfobarButton2AccessibilityIdentifier;
// The duration in seconds that the InfobarCoordinator banner will be presented // The duration in seconds that the InfobarCoordinator banner will be presented
// for. // for.
extern const NSTimeInterval kInfobarBannerPresentationDurationInSeconds; extern const NSTimeInterval kInfobarBannerDefaultPresentationDurationInSeconds;
// The duration in seconds that a high priority presentation InfobarCoordinator
// banner will be presented for.
extern const NSTimeInterval kInfobarBannerLongPresentationDurationInSeconds;
#endif // IOS_CHROME_BROWSER_UI_INFOBARS_INFOBAR_CONSTANTS_H_ #endif // IOS_CHROME_BROWSER_UI_INFOBARS_INFOBAR_CONSTANTS_H_
...@@ -16,4 +16,5 @@ NSString* const kConfirmInfobarButton1AccessibilityIdentifier = ...@@ -16,4 +16,5 @@ NSString* const kConfirmInfobarButton1AccessibilityIdentifier =
NSString* const kConfirmInfobarButton2AccessibilityIdentifier = NSString* const kConfirmInfobarButton2AccessibilityIdentifier =
@"confirmInfobarButton2AXID"; @"confirmInfobarButton2AXID";
const NSTimeInterval kInfobarBannerPresentationDurationInSeconds = 8.0; const NSTimeInterval kInfobarBannerDefaultPresentationDurationInSeconds = 8.0;
const NSTimeInterval kInfobarBannerLongPresentationDurationInSeconds = 15.0;
...@@ -287,8 +287,7 @@ ...@@ -287,8 +287,7 @@
if (!(self.infobarBannerState == if (!(self.infobarBannerState ==
InfobarBannerPresentationState::NotPresented) || InfobarBannerPresentationState::NotPresented) ||
(!self.baseViewController.view.window)) { (!self.baseViewController.view.window)) {
if (![self.infobarCoordinatorsToPresent containsObject:infobarCoordinator]) [self queueInfobarCoordinatorForPresentation:infobarCoordinator];
[self.infobarCoordinatorsToPresent addObject:infobarCoordinator];
return; return;
} }
...@@ -300,9 +299,12 @@ ...@@ -300,9 +299,12 @@
// Dismisses the presented InfobarCoordinator banner after // Dismisses the presented InfobarCoordinator banner after
// kInfobarBannerPresentationDurationInSeconds seconds. // kInfobarBannerPresentationDurationInSeconds seconds.
if (!UIAccessibilityIsVoiceOverRunning()) { if (!UIAccessibilityIsVoiceOverRunning()) {
dispatch_time_t popTime = dispatch_time( NSTimeInterval timeInterval =
DISPATCH_TIME_NOW, infobarCoordinator.highPriorityPresentation
kInfobarBannerPresentationDurationInSeconds * NSEC_PER_SEC); ? kInfobarBannerLongPresentationDurationInSeconds
: kInfobarBannerDefaultPresentationDurationInSeconds;
dispatch_time_t popTime =
dispatch_time(DISPATCH_TIME_NOW, timeInterval * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void) { dispatch_after(popTime, dispatch_get_main_queue(), ^(void) {
[infobarCoordinator dismissInfobarBannerAfterInteraction]; [infobarCoordinator dismissInfobarBannerAfterInteraction];
}); });
...@@ -322,4 +324,17 @@ ...@@ -322,4 +324,17 @@
return nil; return nil;
} }
// Queues an InfobarBanner for presentation. If it has already been queued it
// won't be added again.
- (void)queueInfobarCoordinatorForPresentation:
(InfobarCoordinator*)coordinator {
if (![self.infobarCoordinatorsToPresent containsObject:coordinator]) {
if (coordinator.highPriorityPresentation) {
[self.infobarCoordinatorsToPresent insertObject:coordinator atIndex:0];
} else {
[self.infobarCoordinatorsToPresent addObject:coordinator];
}
}
}
@end @end
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