// 
// Decompiled by Procyon v0.6.0
// 

package io.sentry;

import java.util.Locale;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Collection;
import java.util.ArrayList;
import io.sentry.util.SampleRateUtils;
import java.util.Collections;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.List;
import org.jetbrains.annotations.NotNull;
import io.sentry.protocol.SdkVersion;
import java.util.Set;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.ApiStatus;

public final class SentryReplayOptions
{
    public static final String TEXT_VIEW_CLASS_NAME = "android.widget.TextView";
    public static final String IMAGE_VIEW_CLASS_NAME = "android.widget.ImageView";
    public static final String WEB_VIEW_CLASS_NAME = "android.webkit.WebView";
    public static final String VIDEO_VIEW_CLASS_NAME = "android.widget.VideoView";
    public static final String ANDROIDX_MEDIA_VIEW_CLASS_NAME = "androidx.media3.ui.PlayerView";
    public static final String EXOPLAYER_CLASS_NAME = "com.google.android.exoplayer2.ui.PlayerView";
    public static final String EXOPLAYER_STYLED_CLASS_NAME = "com.google.android.exoplayer2.ui.StyledPlayerView";
    @ApiStatus.Internal
    public static final int MAX_NETWORK_BODY_SIZE = 153600;
    @Nullable
    private Double sessionSampleRate;
    @Nullable
    private Double onErrorSampleRate;
    private Set<String> maskViewClasses;
    private Set<String> unmaskViewClasses;
    @Nullable
    private String maskViewContainerClass;
    @Nullable
    private String unmaskViewContainerClass;
    private SentryReplayQuality quality;
    private int frameRate;
    private long errorReplayDuration;
    private long sessionSegmentDuration;
    private long sessionDuration;
    private boolean trackConfiguration;
    @Nullable
    private SdkVersion sdkVersion;
    private boolean debug;
    @ApiStatus.Experimental
    @NotNull
    private ScreenshotStrategyType screenshotStrategy;
    @NotNull
    private List<String> networkDetailAllowUrls;
    @NotNull
    private List<String> networkDetailDenyUrls;
    private boolean networkCaptureBodies;
    @NotNull
    private static final List<String> DEFAULT_HEADERS;
    @NotNull
    private List<String> networkRequestHeaders;
    @NotNull
    private List<String> networkResponseHeaders;
    
    @ApiStatus.Internal
    @NotNull
    public static List<String> getNetworkDetailsDefaultHeaders() {
        return SentryReplayOptions.DEFAULT_HEADERS;
    }
    
    public SentryReplayOptions(final boolean empty, @Nullable final SdkVersion sdkVersion) {
        this.maskViewClasses = new CopyOnWriteArraySet<String>();
        this.unmaskViewClasses = new CopyOnWriteArraySet<String>();
        this.maskViewContainerClass = null;
        this.unmaskViewContainerClass = null;
        this.quality = SentryReplayQuality.MEDIUM;
        this.frameRate = 1;
        this.errorReplayDuration = 30000L;
        this.sessionSegmentDuration = 5000L;
        this.sessionDuration = 3600000L;
        this.trackConfiguration = true;
        this.debug = false;
        this.screenshotStrategy = ScreenshotStrategyType.PIXEL_COPY;
        this.networkDetailAllowUrls = Collections.emptyList();
        this.networkDetailDenyUrls = Collections.emptyList();
        this.networkCaptureBodies = true;
        this.networkRequestHeaders = SentryReplayOptions.DEFAULT_HEADERS;
        this.networkResponseHeaders = SentryReplayOptions.DEFAULT_HEADERS;
        if (!empty) {
            this.setMaskAllText(true);
            this.setMaskAllImages(true);
            this.maskViewClasses.add("android.webkit.WebView");
            this.maskViewClasses.add("android.widget.VideoView");
            this.maskViewClasses.add("androidx.media3.ui.PlayerView");
            this.maskViewClasses.add("com.google.android.exoplayer2.ui.PlayerView");
            this.maskViewClasses.add("com.google.android.exoplayer2.ui.StyledPlayerView");
            this.sdkVersion = sdkVersion;
        }
    }
    
    public SentryReplayOptions(@Nullable final Double sessionSampleRate, @Nullable final Double onErrorSampleRate, @Nullable final SdkVersion sdkVersion) {
        this(false, sdkVersion);
        this.sessionSampleRate = sessionSampleRate;
        this.onErrorSampleRate = onErrorSampleRate;
        this.sdkVersion = sdkVersion;
    }
    
    @Nullable
    public Double getOnErrorSampleRate() {
        return this.onErrorSampleRate;
    }
    
    public boolean isSessionReplayEnabled() {
        return this.getSessionSampleRate() != null && this.getSessionSampleRate() > 0.0;
    }
    
    public void setOnErrorSampleRate(@Nullable final Double onErrorSampleRate) {
        if (!SampleRateUtils.isValidSampleRate(onErrorSampleRate)) {
            throw new IllegalArgumentException("The value " + onErrorSampleRate + " is not valid. Use null to disable or values >= 0.0 and <= 1.0.");
        }
        this.onErrorSampleRate = onErrorSampleRate;
    }
    
    @Nullable
    public Double getSessionSampleRate() {
        return this.sessionSampleRate;
    }
    
    public boolean isSessionReplayForErrorsEnabled() {
        return this.getOnErrorSampleRate() != null && this.getOnErrorSampleRate() > 0.0;
    }
    
    public void setSessionSampleRate(@Nullable final Double sessionSampleRate) {
        if (!SampleRateUtils.isValidSampleRate(sessionSampleRate)) {
            throw new IllegalArgumentException("The value " + sessionSampleRate + " is not valid. Use null to disable or values >= 0.0 and <= 1.0.");
        }
        this.sessionSampleRate = sessionSampleRate;
    }
    
    public void setMaskAllText(final boolean maskAllText) {
        if (maskAllText) {
            this.addMaskViewClass("android.widget.TextView");
            this.unmaskViewClasses.remove("android.widget.TextView");
        }
        else {
            this.addUnmaskViewClass("android.widget.TextView");
            this.maskViewClasses.remove("android.widget.TextView");
        }
    }
    
    public void setMaskAllImages(final boolean maskAllImages) {
        if (maskAllImages) {
            this.addMaskViewClass("android.widget.ImageView");
            this.unmaskViewClasses.remove("android.widget.ImageView");
        }
        else {
            this.addUnmaskViewClass("android.widget.ImageView");
            this.maskViewClasses.remove("android.widget.ImageView");
        }
    }
    
    @NotNull
    public Set<String> getMaskViewClasses() {
        return this.maskViewClasses;
    }
    
    public void addMaskViewClass(@NotNull final String className) {
        this.maskViewClasses.add(className);
    }
    
    @NotNull
    public Set<String> getUnmaskViewClasses() {
        return this.unmaskViewClasses;
    }
    
    public void addUnmaskViewClass(@NotNull final String className) {
        this.unmaskViewClasses.add(className);
    }
    
    @ApiStatus.Internal
    @NotNull
    public SentryReplayQuality getQuality() {
        return this.quality;
    }
    
    public void setQuality(@NotNull final SentryReplayQuality quality) {
        this.quality = quality;
    }
    
    @ApiStatus.Internal
    public int getFrameRate() {
        return this.frameRate;
    }
    
    @ApiStatus.Internal
    public long getErrorReplayDuration() {
        return this.errorReplayDuration;
    }
    
    @ApiStatus.Internal
    public long getSessionSegmentDuration() {
        return this.sessionSegmentDuration;
    }
    
    @ApiStatus.Internal
    public long getSessionDuration() {
        return this.sessionDuration;
    }
    
    @ApiStatus.Internal
    public void setMaskViewContainerClass(@NotNull final String containerClass) {
        this.addMaskViewClass(containerClass);
        this.maskViewContainerClass = containerClass;
    }
    
    @ApiStatus.Internal
    public void setUnmaskViewContainerClass(@NotNull final String containerClass) {
        this.unmaskViewContainerClass = containerClass;
    }
    
    @ApiStatus.Internal
    @Nullable
    public String getMaskViewContainerClass() {
        return this.maskViewContainerClass;
    }
    
    @ApiStatus.Internal
    @Nullable
    public String getUnmaskViewContainerClass() {
        return this.unmaskViewContainerClass;
    }
    
    @ApiStatus.Internal
    public boolean isTrackConfiguration() {
        return this.trackConfiguration;
    }
    
    @ApiStatus.Internal
    public void setTrackConfiguration(final boolean trackConfiguration) {
        this.trackConfiguration = trackConfiguration;
    }
    
    @ApiStatus.Internal
    @Nullable
    public SdkVersion getSdkVersion() {
        return this.sdkVersion;
    }
    
    @ApiStatus.Internal
    public void setSdkVersion(@Nullable final SdkVersion sdkVersion) {
        this.sdkVersion = sdkVersion;
    }
    
    public boolean isDebug() {
        return this.debug;
    }
    
    public void setDebug(final boolean debug) {
        this.debug = debug;
    }
    
    @ApiStatus.Experimental
    @NotNull
    public ScreenshotStrategyType getScreenshotStrategy() {
        return this.screenshotStrategy;
    }
    
    @ApiStatus.Experimental
    public void setScreenshotStrategy(@NotNull final ScreenshotStrategyType screenshotStrategy) {
        this.screenshotStrategy = screenshotStrategy;
    }
    
    @NotNull
    public List<String> getNetworkDetailAllowUrls() {
        return this.networkDetailAllowUrls;
    }
    
    public void setNetworkDetailAllowUrls(@NotNull final List<String> networkDetailAllowUrls) {
        this.networkDetailAllowUrls = Collections.unmodifiableList((List<? extends String>)new ArrayList<String>(networkDetailAllowUrls));
    }
    
    @NotNull
    public List<String> getNetworkDetailDenyUrls() {
        return this.networkDetailDenyUrls;
    }
    
    public void setNetworkDetailDenyUrls(@NotNull final List<String> networkDetailDenyUrls) {
        this.networkDetailDenyUrls = Collections.unmodifiableList((List<? extends String>)new ArrayList<String>(networkDetailDenyUrls));
    }
    
    public boolean isNetworkCaptureBodies() {
        return this.networkCaptureBodies;
    }
    
    public void setNetworkCaptureBodies(final boolean networkCaptureBodies) {
        this.networkCaptureBodies = networkCaptureBodies;
    }
    
    @NotNull
    public List<String> getNetworkRequestHeaders() {
        return this.networkRequestHeaders;
    }
    
    public void setNetworkRequestHeaders(@NotNull final List<String> networkRequestHeaders) {
        this.networkRequestHeaders = mergeHeaders(SentryReplayOptions.DEFAULT_HEADERS, networkRequestHeaders);
    }
    
    @NotNull
    public List<String> getNetworkResponseHeaders() {
        return this.networkResponseHeaders;
    }
    
    public void setNetworkResponseHeaders(@NotNull final List<String> networkResponseHeaders) {
        this.networkResponseHeaders = mergeHeaders(SentryReplayOptions.DEFAULT_HEADERS, networkResponseHeaders);
    }
    
    @NotNull
    private static List<String> mergeHeaders(@NotNull final List<String> defaultHeaders, @NotNull final List<String> additionalHeaders) {
        final Set<String> merged = new LinkedHashSet<String>();
        merged.addAll(defaultHeaders);
        merged.addAll(additionalHeaders);
        return Collections.unmodifiableList((List<? extends String>)new ArrayList<String>(merged));
    }
    
    static {
        DEFAULT_HEADERS = Collections.unmodifiableList((List<? extends String>)Arrays.asList("Content-Type", "Content-Length", "Accept"));
    }
    
    public enum SentryReplayQuality
    {
        LOW(0.8f, 50000, 10), 
        MEDIUM(1.0f, 75000, 30), 
        HIGH(1.0f, 100000, 50);
        
        public final float sizeScale;
        public final int bitRate;
        public final int screenshotQuality;
        
        private SentryReplayQuality(final float sizeScale, final int bitRate, final int screenshotQuality) {
            this.sizeScale = sizeScale;
            this.bitRate = bitRate;
            this.screenshotQuality = screenshotQuality;
        }
        
        @NotNull
        public String serializedName() {
            return this.name().toLowerCase(Locale.ROOT);
        }
    }
}
