blob: 243db238defd335a887da1ad6bb7226028995d16 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.chrome.browser.messages;
import android.text.format.DateUtils;
import androidx.annotation.VisibleForTesting;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.components.messages.MessageAutodismissDurationProvider;
import org.chromium.components.messages.MessageIdentifier;
import org.chromium.components.messages.MessagesMetrics;
import org.chromium.ui.accessibility.AccessibilityState;
/**
* Implementation of {@link MessageAutodismissDurationProvider}.
*
* Use finch parameter "autodismiss_duration_ms_{@link MessageIdentifier}" to customize through
* finch config, such as "autodismiss_duration_ms_SyncError" within the feature {@code
* ChromeFeatureList.MESSAGES_FOR_ANDROID_INFRASTRUCTURE}. The duration configured in this way will
* take the highest priority over clients' configuration in code.
*/
public class ChromeMessageAutodismissDurationProvider
implements MessageAutodismissDurationProvider {
@VisibleForTesting
static final String FEATURE_SPECIFIC_FINCH_CONTROLLED_DURATION_PREFIX =
"autodismiss_duration_ms_";
private long mAutodismissDurationMs;
private long mAutodismissDurationWithA11yMs;
public ChromeMessageAutodismissDurationProvider() {
mAutodismissDurationMs = ChromeFeatureList.getFieldTrialParamByFeatureAsInt(
ChromeFeatureList.MESSAGES_FOR_ANDROID_INFRASTRUCTURE, "autodismiss_duration_ms",
10 * (int) DateUtils.SECOND_IN_MILLIS);
mAutodismissDurationWithA11yMs = ChromeFeatureList.getFieldTrialParamByFeatureAsInt(
ChromeFeatureList.MESSAGES_FOR_ANDROID_INFRASTRUCTURE,
"autodismiss_duration_with_a11y_ms", 30 * (int) DateUtils.SECOND_IN_MILLIS);
}
@Override
public long get(@MessageIdentifier int messageIdentifier, long customDuration) {
long nonA11yDuration = Math.max(mAutodismissDurationMs, customDuration);
long finchControlledDuration = ChromeFeatureList.getFieldTrialParamByFeatureAsInt(
ChromeFeatureList.MESSAGES_FOR_ANDROID_INFRASTRUCTURE,
FEATURE_SPECIFIC_FINCH_CONTROLLED_DURATION_PREFIX
+ MessagesMetrics.messageIdentifierToHistogramSuffix(messageIdentifier),
-1);
if (finchControlledDuration > 0) {
nonA11yDuration = Math.max(finchControlledDuration, nonA11yDuration);
}
// If no a11y service that can perform gestures is enabled, use the set duration. Otherwise
// multiply the duration by the recommended multiplier and use that with a minimum of 30s.
return !AccessibilityState.isPerformGesturesEnabled()
? nonA11yDuration
: Math.max(mAutodismissDurationWithA11yMs,
(long) (AccessibilityState.getRecommendedTimeoutMultiplier()
* nonA11yDuration));
}
@VisibleForTesting
public void setDefaultAutodismissDurationMsForTesting(long duration) {
mAutodismissDurationMs = duration;
}
public void setDefaultAutodismissDurationWithA11yMsForTesting(long duration) {
mAutodismissDurationWithA11yMs = duration;
}
}