/* * Copyright (c) 2018 Nam Nguyen, nam@ene.im * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ml.docilealligator.infinityforreddit.videoautoplay; import static androidx.media3.exoplayer.DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF; import static ml.docilealligator.infinityforreddit.videoautoplay.ToroUtil.checkNotNull; import android.content.Context; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.OptIn; import androidx.core.util.ObjectsCompat; import androidx.media3.common.util.UnstableApi; import androidx.media3.datasource.DataSource; import androidx.media3.datasource.cache.Cache; import androidx.media3.exoplayer.DefaultRenderersFactory; import androidx.media3.exoplayer.ExoPlayer; import androidx.media3.exoplayer.source.MediaSource; import androidx.media3.exoplayer.upstream.DefaultBandwidthMeter; /** * Necessary configuration for {@link ExoCreator} to produces {@link ExoPlayer} and * {@link MediaSource}. Instance of this class must be construct using {@link Builder}. * * @author eneim (2018/01/23). * @since 3.4.0 */ @UnstableApi @SuppressWarnings("SimplifiableIfStatement") // public final class Config { @Nullable private final Context context; // primitive flags @DefaultRenderersFactory.ExtensionRendererMode final int extensionMode; // NonNull options @NonNull final BaseMeter meter; @NonNull final MediaSourceBuilder mediaSourceBuilder; // Nullable options @UnstableApi @Nullable final Cache cache; // null by default // If null, ExoCreator must come up with a default one. // This is to help customizing the Data source, for example using OkHttp extension. @Nullable final DataSource.Factory dataSourceFactory; @OptIn(markerClass = UnstableApi.class) @SuppressWarnings("WeakerAccess") Config(@Nullable Context context, int extensionMode, @NonNull BaseMeter meter, @Nullable DataSource.Factory dataSourceFactory, @NonNull MediaSourceBuilder mediaSourceBuilder, @Nullable Cache cache) { this.context = context != null ? context.getApplicationContext() : null; this.extensionMode = extensionMode; this.meter = meter; this.dataSourceFactory = dataSourceFactory; this.mediaSourceBuilder = mediaSourceBuilder; this.cache = cache; } @OptIn(markerClass = UnstableApi.class) @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Config config = (Config) o; if (extensionMode != config.extensionMode) return false; if (!meter.equals(config.meter)) return false; if (!mediaSourceBuilder.equals(config.mediaSourceBuilder)) return false; if (!ObjectsCompat.equals(cache, config.cache)) return false; return ObjectsCompat.equals(dataSourceFactory, config.dataSourceFactory); } @OptIn(markerClass = UnstableApi.class) @Override public int hashCode() { int result = extensionMode; result = 31 * result + meter.hashCode(); result = 31 * result + mediaSourceBuilder.hashCode(); result = 31 * result + (cache != null ? cache.hashCode() : 0); result = 31 * result + (dataSourceFactory != null ? dataSourceFactory.hashCode() : 0); return result; } @OptIn(markerClass = UnstableApi.class) @SuppressWarnings("unused") public Builder newBuilder() { return new Builder(context).setCache(this.cache) .setExtensionMode(this.extensionMode) .setMediaSourceBuilder(this.mediaSourceBuilder) .setMeter(this.meter); } /// Builder @UnstableApi @SuppressWarnings({"unused", "WeakerAccess"}) // public static final class Builder { @Nullable // only for backward compatibility final Context context; /** * @deprecated Use the constructor with nonnull {@link Context} instead. */ @Deprecated public Builder() { this(null); } @OptIn(markerClass = UnstableApi.class) public Builder(@Nullable Context context) { this.context = context != null ? context.getApplicationContext() : null; DefaultBandwidthMeter bandwidthMeter = new DefaultBandwidthMeter.Builder(this.context).build(); meter = new BaseMeter<>(bandwidthMeter); } @UnstableApi @DefaultRenderersFactory.ExtensionRendererMode private int extensionMode = EXTENSION_RENDERER_MODE_OFF; private BaseMeter meter; private DataSource.Factory dataSourceFactory = null; private MediaSourceBuilder mediaSourceBuilder = MediaSourceBuilder.DEFAULT; @UnstableApi private Cache cache = null; @OptIn(markerClass = UnstableApi.class) public Builder setExtensionMode(@DefaultRenderersFactory.ExtensionRendererMode int extensionMode) { this.extensionMode = extensionMode; return this; } @OptIn(markerClass = UnstableApi.class) public Builder setMeter(@NonNull BaseMeter meter) { this.meter = checkNotNull(meter, "Need non-null BaseMeter"); return this; } // Option is Nullable, but if user customize this, it must be a Nonnull one. public Builder setDataSourceFactory(@NonNull DataSource.Factory dataSourceFactory) { this.dataSourceFactory = checkNotNull(dataSourceFactory); return this; } public Builder setMediaSourceBuilder(@NonNull MediaSourceBuilder mediaSourceBuilder) { this.mediaSourceBuilder = checkNotNull(mediaSourceBuilder, "Need non-null MediaSourceBuilder"); return this; } @OptIn(markerClass = UnstableApi.class) public Builder setCache(@Nullable Cache cache) { this.cache = cache; return this; } @OptIn(markerClass = UnstableApi.class) public Config build() { return new Config(context, extensionMode, meter, dataSourceFactory, mediaSourceBuilder, cache); } } }