/* * Copyright (C) 2018 The Android Open Source Project * * 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.android.textclassifier.downloader; import com.android.textclassifier.common.ModelType.ModelTypeDef; import com.android.textclassifier.downloader.DownloadedModelDatabase.Manifest; import com.android.textclassifier.downloader.DownloadedModelDatabase.ManifestEnrollment; import com.android.textclassifier.downloader.DownloadedModelDatabase.Model; import com.android.textclassifier.utils.IndentingPrintWriter; import com.google.common.collect.ImmutableMap; import java.io.File; import java.util.List; import javax.annotation.Nullable; // TODO(licha): Let Worker access DB class directly, then we can make this a lister interface /** An interface to provide easy access to DownloadedModelDatabase. */ public interface DownloadedModelManager { /** Returns the directory containing models downloaded by the downloader. */ File getModelDownloaderDir(); /** * Returns all downloaded model files for the given modelType * *
This method should return quickly as it may be on the critical path of serving requests.
*
* @param modelType the type of the model
* @return the model files. Empty if no suitable model found
*/
@Nullable
List The model must be linked to a manifest via #registerManifest(). Otherwise it will be cleaned
* up automatically later.
*
* @param modelUrl the url where we downloaded model from
* @param modelPath the path where we store the downloaded model
*/
void registerModel(String modelUrl, String modelPath);
/**
* Add a newly downloaded manifest to the internal database.
*
* The manifest must be linked to a specific use case via #registerManifestEnrollment().
* Otherwise it will be cleaned up automatically later. Currently there is only one model in one
* manifest.
*
* @param manifestUrl the url where we downloaded manifest
* @param modelUrl the url where we downloaded the only model inside the manifest
*/
void registerManifest(String manifestUrl, String modelUrl);
/**
* Add a failure records for the given manifest url.
*
* If the manifest failed before, then increase the prevFailureCounts by one. We skip manifest
* if it failed too many times before.
*
* @param manifestUrl the failed manifest url
*/
void registerManifestDownloadFailure(String manifestUrl);
/**
* Link a manifest to a specific (modelType, localeTag) use case.
*
* After this registration, we will start to use this model file for all requests for the given
* locale and the specified model type.
*
* @param modelType the model type
* @param localeTag the tag of the locale on user's device that this manifest should be used for
* @param manifestUrl the url of the manifest
*/
void registerManifestEnrollment(
@ModelTypeDef String modelType, String localeTag, String manifestUrl);
/**
* Clean up unused downloaded models and update other internal states.
*
* @param manifestsToDownload Map