blob: e938efdebaf10f7903531adcfe14c183e68303d3 [file] [log] [blame]
/*
* Copyright 2022 Google LLC
*
* 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 com.google.android.libraries.mobiledatadownload.downloader;
import static com.google.android.libraries.mobiledatadownload.internal.MddConstants.INLINE_FILE_URL_SCHEME;
import static com.google.common.base.Preconditions.checkArgument;
import android.net.Uri;
import android.util.Pair;
import com.google.auto.value.AutoValue;
import com.google.common.base.Optional;
import com.google.common.collect.ImmutableList;
import javax.annotation.concurrent.Immutable;
/** Request to download a file. */
@Immutable
@AutoValue
public abstract class DownloadRequest {
// Default value for Traffic Tag if not set by clients.
// MDD will not tag the traffic if the TrafficTag is not set to a valid value (>0).
private static final int UNSPECIFIED_TRAFFIC_TAG = -1;
DownloadRequest() {}
/** The File Uri to download the file at. */
public abstract Uri fileUri();
/** The url to download the file from. */
public abstract String urlToDownload();
/**
* Conditions under which this file should be downloaded.
*
* <p>These conditions relate to the type of network that should be used when downloading and must
* be provided when performing a network download.
*
* <p>When performing in-memory downloads (using the "inlinefile" url scheme), this will not be
* used.
*/
public abstract DownloadConstraints downloadConstraints();
/**
* Traffic tag used for this request.
*
* <p>If not set, it will take the default value of UNSPECIFIED_TRAFFIC_TAG and MDD will not tag
* the traffic.
*/
public abstract int trafficTag();
/** The extra HTTP headers for this request. */
public abstract ImmutableList<Pair<String, String>> extraHttpHeaders();
/**
* Parameters for inline file downloads.
*
* <p>An instance of {@link InlineDownloadParams} must be included in the request to support
* in-memory downloads (see <internal> for more info on the "inlinefile" url scheme).
*
* <p>Implementations of {@link FileDownloader} that support downloading from an inline file
* should ensure that 1) the "inlinefile" url scheme is used and 2) an {@link
* InlineDownloadParams} is provided.
*/
public abstract Optional<InlineDownloadParams> inlineDownloadParamsOptional();
public static Builder newBuilder() {
return new AutoValue_DownloadRequest.Builder()
.setTrafficTag(UNSPECIFIED_TRAFFIC_TAG)
.setExtraHttpHeaders(ImmutableList.of());
}
/** Builder for {@link DownloadRequest}. */
@AutoValue.Builder
public abstract static class Builder {
Builder() {}
/** Sets the on-device destination uri of the file. */
public abstract Builder setFileUri(Uri fileUri);
/** Sets the url from where file content should be downloaded. */
public abstract Builder setUrlToDownload(String urlToDownload);
/**
* Sets the network constraints that should be used for the download.
*
* <p>Only required when performing network downloads. If performing an in-memory download, this
* is not required.
*/
public abstract Builder setDownloadConstraints(DownloadConstraints downloadConstraints);
/** Sets the traffic tag for this request. */
public abstract Builder setTrafficTag(int trafficTag);
/** Sets the extra HTTP headers for this request. */
public abstract Builder setExtraHttpHeaders(
ImmutableList<Pair<String, String>> extraHttpHeaders);
/**
* Sets the parameters for an inline file download.
*
* <p>Only required when performing an in-memory download (using an "inlinefile" url scheme). If
* performing a network download, this is not required.
*/
public abstract Builder setInlineDownloadParamsOptional(
InlineDownloadParams inlineDownloadParams);
/** Builds a {@link DownloadRequest} and checks for correct data. */
public final DownloadRequest build() {
// Ensure that inlinefile: requests include InlineDownloadParams
if (urlToDownload().startsWith(INLINE_FILE_URL_SCHEME)) {
checkArgument(
inlineDownloadParamsOptional().isPresent(),
"InlineDownloadParams must be set when using inlinefile: scheme");
// inline file request doesn't require download constraints, so set to NONE.
setDownloadConstraints(DownloadConstraints.NONE);
}
return autoBuild();
}
/** Tells AutoValue to generate an automated builder used in {@link #build} */
abstract DownloadRequest autoBuild();
abstract String urlToDownload();
abstract Optional<InlineDownloadParams> inlineDownloadParamsOptional();
}
}