blob: 8c1775e9a648212d2a86304c9ec0ce731b8dd4ad [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 static android.view.accessibility.AccessibilityManager.FLAG_CONTENT_CONTROLS;
import static android.view.accessibility.AccessibilityManager.FLAG_CONTENT_ICONS;
import static android.view.accessibility.AccessibilityManager.FLAG_CONTENT_TEXT;
import android.os.Build;
import android.text.format.DateUtils;
import androidx.annotation.VisibleForTesting;
import org.chromium.chrome.browser.flags.ChromeFeatureList;
import org.chromium.chrome.browser.util.ChromeAccessibilityUtil;
import org.chromium.components.messages.MessageAutodismissDurationProvider;
import org.chromium.components.messages.MessageIdentifier;
import org.chromium.components.messages.MessagesMetrics;
/**
* 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 (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
&& ChromeAccessibilityUtil.get().isAccessibilityEnabled()) {
// crbug.com/1312548: To have a minimum duration even if the system has a default value.
return Math.max(mAutodismissDurationWithA11yMs,
ChromeAccessibilityUtil.get().getRecommendedTimeoutMillis((int) nonA11yDuration,
FLAG_CONTENT_ICONS | FLAG_CONTENT_CONTROLS | FLAG_CONTENT_TEXT));
}
return ChromeAccessibilityUtil.get().isAccessibilityEnabled()
? Math.max(mAutodismissDurationWithA11yMs, nonA11yDuration)
: nonA11yDuration;
}
@VisibleForTesting
public void setDefaultAutodismissDurationMsForTesting(long duration) {
mAutodismissDurationMs = duration;
}
public void setDefaultAutodismissDurationWithA11yMsForTesting(long duration) {
mAutodismissDurationWithA11yMs = duration;
}
}