blob: a9ec299c4cd8a9006cd401d8e7c3a1c31b423e65 [file] [log] [blame]
/*
* Copyright (C) 2016 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 android.telephony;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.RemoteException;
import android.telephony.mbms.IDownloadCallback;
import android.telephony.mbms.DownloadRequest;
import android.telephony.mbms.DownloadStatus;
import android.telephony.mbms.IMbmsDownloadManagerCallback;
import android.telephony.mbms.MbmsException;
import android.telephony.mbms.vendor.IMbmsDownloadService;
import android.util.Log;
import java.util.List;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
/** @hide */
public class MbmsDownloadManager {
private static final String LOG_TAG = MbmsDownloadManager.class.getSimpleName();
/**
* The MBMS middleware should send this when a download of single file has completed or
* failed. Mandatory extras are
* {@link #EXTRA_RESULT}
* {@link #EXTRA_INFO}
* {@link #EXTRA_REQUEST}
* {@link #EXTRA_TEMP_LIST}
* {@link #EXTRA_FINAL_URI}
*
* TODO: future systemapi
*/
public static final String ACTION_DOWNLOAD_RESULT_INTERNAL =
"android.telephony.mbms.action.DOWNLOAD_RESULT_INTERNAL";
/**
* The MBMS middleware should send this when it wishes to request {@code content://} URIs to
* serve as temp files for downloads or when it wishes to resume paused downloads. Mandatory
* extras are
* {@link #EXTRA_REQUEST}
*
* Optional extras are
* {@link #EXTRA_FD_COUNT} (0 if not present)
* {@link #EXTRA_PAUSED_LIST} (empty if not present)
*
* TODO: future systemapi
*/
public static final String ACTION_FILE_DESCRIPTOR_REQUEST =
"android.telephony.mbms.action.FILE_DESCRIPTOR_REQUEST";
/**
* The MBMS middleware should send this when it wishes to clean up temp files in the app's
* filesystem. Mandatory extras are:
* {@link #EXTRA_TEMP_FILES_IN_USE}
*
* TODO: future systemapi
*/
public static final String ACTION_CLEANUP =
"android.telephony.mbms.action.CLEANUP";
/**
* Integer extra indicating the result code of the download.
* TODO: put in link to error list
* TODO: future systemapi (here and and all extras)
*/
public static final String EXTRA_RESULT = "android.telephony.mbms.extra.RESULT";
/**
* Extra containing the {@link android.telephony.mbms.FileInfo} for which the download result
* is for. Must not be null.
*/
public static final String EXTRA_INFO = "android.telephony.mbms.extra.INFO";
/**
* Extra containing the {@link DownloadRequest} for which the download result or file
* descriptor request is for. Must not be null.
*/
public static final String EXTRA_REQUEST = "android.telephony.mbms.extra.REQUEST";
/**
* Extra containing a {@link List} of {@link Uri}s that were used as temp files for this
* completed file. These {@link Uri}s should have scheme {@code file://}, and the temp
* files will be deleted upon receipt of the intent.
* May be null.
*/
public static final String EXTRA_TEMP_LIST = "android.telephony.mbms.extra.TEMP_LIST";
/**
* Extra containing a single {@link Uri} indicating the path to the temp file in which the
* decoded downloaded file resides. Must not be null.
*/
public static final String EXTRA_FINAL_URI = "android.telephony.mbms.extra.FINAL_URI";
/**
* Extra containing an integer indicating the number of temp files requested.
*/
public static final String EXTRA_FD_COUNT = "android.telephony.mbms.extra.FD_COUNT";
/**
* Extra containing a list of {@link Uri}s that the middleware is requesting access to via
* {@link #ACTION_FILE_DESCRIPTOR_REQUEST} in order to resume downloading. These {@link Uri}s
* should have scheme {@code file://}.
*/
public static final String EXTRA_PAUSED_LIST = "android.telephony.mbms.extra.PAUSED_LIST";
/**
* Extra containing a list of {@link android.telephony.mbms.UriPathPair}s, used in the
* response to {@link #ACTION_FILE_DESCRIPTOR_REQUEST}. These are temp files that are meant
* to be used for new file downloads.
*/
public static final String EXTRA_FREE_URI_LIST = "android.telephony.mbms.extra.FREE_URI_LIST";
/**
* Extra containing a list of {@link android.telephony.mbms.UriPathPair}s, used in the
* response to {@link #ACTION_FILE_DESCRIPTOR_REQUEST}. These
* {@link android.telephony.mbms.UriPathPair}s contain {@code content://} URIs that provide
* access to previously paused downloads.
*/
public static final String EXTRA_PAUSED_URI_LIST =
"android.telephony.mbms.extra.PAUSED_URI_LIST";
/**
* Extra containing a list of {@link Uri}s indicating temp files which the middleware is
* still using.
*/
public static final String EXTRA_TEMP_FILES_IN_USE =
"android.telephony.mbms.extra.TEMP_FILES_IN_USE";
public static final int RESULT_SUCCESSFUL = 1;
public static final int RESULT_CANCELLED = 2;
public static final int RESULT_EXPIRED = 3;
// TODO - more results!
private final Context mContext;
private int mSubId = INVALID_SUBSCRIPTION_ID;
private IMbmsDownloadService mService;
private final IMbmsDownloadManagerCallback mCallback;
private final String mDownloadAppName;
private MbmsDownloadManager(Context context, IMbmsDownloadManagerCallback callback,
String downloadAppName, int subId) {
mContext = context;
mCallback = callback;
mDownloadAppName = downloadAppName;
mSubId = subId;
}
/**
* Create a new MbmsDownloadManager using the system default data subscription ID.
*
* Note that this call will bind a remote service and that may take a bit. This
* may throw an Illegal ArgumentException or RemoteException.
*
* @hide
*/
public static MbmsDownloadManager createManager(Context context,
IMbmsDownloadManagerCallback listener, String downloadAppName)
throws MbmsException {
MbmsDownloadManager mdm = new MbmsDownloadManager(context, listener, downloadAppName,
SubscriptionManager.getDefaultSubscriptionId());
mdm.bindAndInitialize();
return mdm;
}
/**
* Create a new MbmsDownloadManager using the given subscription ID.
*
* Note that this call will bind a remote service and that may take a bit. This
* may throw an Illegal ArgumentException or RemoteException.
*
* @hide
*/
public static MbmsDownloadManager createManager(Context context,
IMbmsDownloadManagerCallback listener, String downloadAppName, int subId)
throws MbmsException {
MbmsDownloadManager mdm = new MbmsDownloadManager(context, listener, downloadAppName,
subId);
mdm.bindAndInitialize();
return mdm;
}
private void bindAndInitialize() throws MbmsException {
// TODO: bind
try {
mService.initialize(mDownloadAppName, mSubId, mCallback);
} catch (RemoteException e) {
throw new MbmsException(0); // TODO: proper error code
}
}
/**
* Gets the list of files published for download.
* They may occur at times far in the future.
* servicesClasses lets the app filter on types of files and is opaque data between
* the app and the carrier
*
* Multiple calls replace trhe list of serviceClasses of interest.
*
* May throw an IllegalArgumentException or RemoteException.
*
* Synchronous responses include
* <li>SUCCESS</li>
* <li>ERROR_MSDC_CONCURRENT_SERVICE_LIMIT_REACHED</li>
*
* Asynchronous errors through the listener include any of the errors except
* <li>ERROR_MSDC_UNABLE_TO_)START_SERVICE</li>
* <li>ERROR_MSDC_INVALID_SERVICE_ID</li>
* <li>ERROR_MSDC_END_OF_SESSION</li>
*/
public int getFileServices(List<String> serviceClasses) {
return 0;
}
/**
* Requests a future download.
* returns a token which may be used to cancel a download.
* downloadListener is an optional callback object which can be used to get progress reports
* of a currently occuring download. Note this can only run while the calling app
* is running, so future downloads will simply result in resultIntents being sent
* for completed or errored-out downloads. A NULL indicates no callbacks are needed.
*
* May throw an IllegalArgumentException or RemoteExcpetion.
*
* Asynchronous errors through the listener include any of the errors
*/
public DownloadRequest download(DownloadRequest request, IDownloadCallback listener) {
request.setAppName(mDownloadAppName);
return request;
}
/**
* Returns a list DownloadRequests that originated from this application (UID).
*
* May throw a RemoteException.
*
* Asynchronous errors through the listener include any of the errors except
* <li>ERROR_UNABLED_TO_START_SERVICE</li>
* <li>ERROR_MSDC_INVALID_SERVICE_ID</li>
* <li>ERROR_MSDC_END_OF_SESSION</li>
*/
public List<DownloadRequest> listPendingDownloads() {
return null;
}
/**
* Attempts to cancel the specified DownloadRequest.
*
* May throw a RemoteException.
*
* Synchronous responses may include
* <li>SUCCESS</li>
* <li>ERROR_MSDC_CONCURRENT_SERVICE_LIMIT_REACHED</li>
* <li>ERROR_MSDC_UNKNOWN_REQUEST</li>
*/
public int cancelDownload(DownloadRequest downloadRequest) {
return 0;
}
/**
* Gets information about current and known upcoming downloads.
*
* Current is a straightforward count of the files being downloaded "now"
* for some definition of now (may be racey).
* Future downloads include counts of files with pending repair operations, counts of
* files with future downloads and indication of scheduled download times with unknown
* file details.
*
* May throw an IllegalArgumentException or RemoteException.
*
* If the DownloadRequest is unknown the results will be null.
*/
public DownloadStatus getDownloadStatus(DownloadRequest downloadRequest) {
return null;
}
/**
* Resets middleware knowledge regarding this download request.
*
* This state consists of knowledge of what files have already been downloaded.
* Normally the middleware won't download files who's hash matches previously downloaded
* content, even if that content has since been deleted. If this function is called
* repeated content will be downloaded again when available. This does not interrupt
* in-progress downloads.
*
* May throw an IllegalArgumentException or RemoteException.
*
* <li>SUCCESS</li>
* <li>ERROR_MSDC_CONCURRENT_SERVICE_LIMIT_REACHED</li>
* <li>ERROR_MSDC_UNKNOWN_REQUEST</li>
*/
public int resetDownloadKnowledge(DownloadRequest downloadRequest) {
return 0;
}
public void dispose() {
try {
if (mService != null) {
mService.dispose(mDownloadAppName, mSubId);
} else {
Log.i(LOG_TAG, "Service already dead");
}
} catch (RemoteException e) {
// Ignore
Log.i(LOG_TAG, "Remote exception while disposing of service");
}
}
}