diff options
| -rw-r--r-- | Android.mk | 1 | ||||
| -rw-r--r-- | api/current.txt | 1 | ||||
| -rw-r--r-- | api/system-current.txt | 1 | ||||
| -rw-r--r-- | api/test-current.txt | 1 | ||||
| -rw-r--r-- | core/res/AndroidManifest.xml | 4 | ||||
| -rw-r--r-- | telephony/java/android/telephony/MbmsDownloadManager.java | 62 | ||||
| -rwxr-xr-x | telephony/java/android/telephony/mbms/DownloadStatus.aidl | 19 | ||||
| -rw-r--r-- | telephony/java/android/telephony/mbms/DownloadStatus.java | 77 | ||||
| -rwxr-xr-x | telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl | 4 | ||||
| -rw-r--r-- | telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java | 19 | 
10 files changed, 70 insertions, 119 deletions
| diff --git a/Android.mk b/Android.mk index 7137cd8ed53d..f54984fb2ceb 100644 --- a/Android.mk +++ b/Android.mk @@ -615,7 +615,6 @@ include $(CLEAR_VARS)  aidl_files := \          frameworks/base/telephony/java/android/telephony/mbms/DownloadRequest.aidl \ -        frameworks/base/telephony/java/android/telephony/mbms/DownloadStatus.aidl \          frameworks/base/telephony/java/android/telephony/mbms/FileInfo.aidl \          frameworks/base/telephony/java/android/telephony/mbms/FileServiceInfo.aidl \          frameworks/base/telephony/java/android/telephony/mbms/ServiceInfo.aidl \ diff --git a/api/current.txt b/api/current.txt index b424d2a7739e..a2581b33e49a 100644 --- a/api/current.txt +++ b/api/current.txt @@ -121,6 +121,7 @@ package android {      field public static final java.lang.String REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS";      field public static final java.lang.String REQUEST_INSTALL_PACKAGES = "android.permission.REQUEST_INSTALL_PACKAGES";      field public static final deprecated java.lang.String RESTART_PACKAGES = "android.permission.RESTART_PACKAGES"; +    field public static final java.lang.String SEND_EMBMS_INTENTS = "android.permission.SEND_EMBMS_INTENTS";      field public static final java.lang.String SEND_RESPOND_VIA_MESSAGE = "android.permission.SEND_RESPOND_VIA_MESSAGE";      field public static final java.lang.String SEND_SMS = "android.permission.SEND_SMS";      field public static final java.lang.String SET_ALARM = "com.android.alarm.permission.SET_ALARM"; diff --git a/api/system-current.txt b/api/system-current.txt index 55a6d1e3c9e8..6565c7d1bd77 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -221,6 +221,7 @@ package android {      field public static final java.lang.String RETRIEVE_WINDOW_CONTENT = "android.permission.RETRIEVE_WINDOW_CONTENT";      field public static final java.lang.String REVOKE_RUNTIME_PERMISSIONS = "android.permission.REVOKE_RUNTIME_PERMISSIONS";      field public static final java.lang.String SCORE_NETWORKS = "android.permission.SCORE_NETWORKS"; +    field public static final java.lang.String SEND_EMBMS_INTENTS = "android.permission.SEND_EMBMS_INTENTS";      field public static final java.lang.String SEND_RESPOND_VIA_MESSAGE = "android.permission.SEND_RESPOND_VIA_MESSAGE";      field public static final java.lang.String SEND_SMS = "android.permission.SEND_SMS";      field public static final java.lang.String SEND_SMS_NO_CONFIRMATION = "android.permission.SEND_SMS_NO_CONFIRMATION"; diff --git a/api/test-current.txt b/api/test-current.txt index 2e95ee372a85..5b9e643aeff3 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -121,6 +121,7 @@ package android {      field public static final java.lang.String REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = "android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS";      field public static final java.lang.String REQUEST_INSTALL_PACKAGES = "android.permission.REQUEST_INSTALL_PACKAGES";      field public static final deprecated java.lang.String RESTART_PACKAGES = "android.permission.RESTART_PACKAGES"; +    field public static final java.lang.String SEND_EMBMS_INTENTS = "android.permission.SEND_EMBMS_INTENTS";      field public static final java.lang.String SEND_RESPOND_VIA_MESSAGE = "android.permission.SEND_RESPOND_VIA_MESSAGE";      field public static final java.lang.String SEND_SMS = "android.permission.SEND_SMS";      field public static final java.lang.String SET_ALARM = "com.android.alarm.permission.SET_ALARM"; diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index ab44cd80bda0..9a4d63cd3a55 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1671,6 +1671,10 @@      <permission android:name="android.permission.RECEIVE_STK_COMMANDS"          android:protectionLevel="signature|privileged" /> +    <!-- Allows an application to send EMBMS download intents to apps--> +    <permission android:name="android.permission.SEND_EMBMS_INTENTS" +        android:protectionLevel="signature|privileged" /> +      <!-- Must be required by an ImsService to ensure that only the           system can bind to it.           <p>Protection level: signature|privileged diff --git a/telephony/java/android/telephony/MbmsDownloadManager.java b/telephony/java/android/telephony/MbmsDownloadManager.java index 231f2c8660e9..5fa6a952d709 100644 --- a/telephony/java/android/telephony/MbmsDownloadManager.java +++ b/telephony/java/android/telephony/MbmsDownloadManager.java @@ -16,6 +16,7 @@  package android.telephony; +import android.annotation.IntDef;  import android.annotation.NonNull;  import android.content.ComponentName;  import android.content.Context; @@ -26,9 +27,9 @@ import android.content.pm.ResolveInfo;  import android.net.Uri;  import android.os.IBinder;  import android.os.RemoteException; +import android.telephony.mbms.FileInfo;  import android.telephony.mbms.IDownloadCallback;  import android.telephony.mbms.DownloadRequest; -import android.telephony.mbms.DownloadStatus;  import android.telephony.mbms.IMbmsDownloadManagerCallback;  import android.telephony.mbms.MbmsDownloadManagerCallback;  import android.telephony.mbms.MbmsDownloadReceiver; @@ -40,6 +41,8 @@ import android.util.Log;  import java.io.File;  import java.io.IOException; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy;  import java.util.List;  import java.util.concurrent.atomic.AtomicReference; @@ -192,6 +195,18 @@ public class MbmsDownloadManager {      public static final int RESULT_EXPIRED    = 3;      // TODO - more results! +    /** @hide */ +    @Retention(RetentionPolicy.SOURCE) +    @IntDef({STATUS_UNKNOWN, STATUS_ACTIVELY_DOWNLOADING, STATUS_PENDING_DOWNLOAD, +            STATUS_PENDING_REPAIR, STATUS_PENDING_DOWNLOAD_WINDOW}) +    public @interface DownloadStatus {} + +    public static final int STATUS_UNKNOWN = 0; +    public static final int STATUS_ACTIVELY_DOWNLOADING = 1; +    public static final int STATUS_PENDING_DOWNLOAD = 2; +    public static final int STATUS_PENDING_REPAIR = 3; +    public static final int STATUS_PENDING_DOWNLOAD_WINDOW = 4; +      private final Context mContext;      private int mSubscriptionId = INVALID_SUBSCRIPTION_ID; @@ -271,8 +286,6 @@ public class MbmsDownloadManager {       * The serviceClasses argument lets the app filter on types of programming and is opaque data       * negotiated beforehand between the app and the carrier.       * -     * Multiple calls replace the list of serviceClasses of interest. -     *       * This may throw an {@link MbmsException} containing one of the following errors:       * {@link MbmsException#ERROR_MIDDLEWARE_NOT_BOUND}       * {@link MbmsException#ERROR_CONCURRENT_SERVICE_LIMIT_REACHED} @@ -282,6 +295,12 @@ public class MbmsDownloadManager {       * callback can include any of the errors except:       * {@link MbmsException#ERROR_UNABLE_TO_START_SERVICE}       * {@link MbmsException#ERROR_END_OF_SESSION} +     * +     * @param classList A list of service classes which the app wishes to receive +     *                  {@link IMbmsDownloadManagerCallback#fileServicesUpdated(List)} callbacks +     *                  about. Subsequent calls to this method will replace this list of service +     *                  classes (i.e. the middleware will no longer send updates for services +     *                  matching classes only in the old list).       */      public void getFileServices(List<String> classList) throws MbmsException {          IMbmsDownloadService downloadService = mService.get(); @@ -312,8 +331,9 @@ public class MbmsDownloadManager {       * will default to a directory formed by the concatenation of the app's files directory and       * {@link android.telephony.mbms.MbmsTempFileProvider#DEFAULT_TOP_LEVEL_TEMP_DIRECTORY}.       * -     * This method may not be called while any download requests are still active. If this is -     * the case, an {@link MbmsException} will be thrown with code +     * Before calling this method, the app must cancel all of its pending +     * {@link DownloadRequest}s via {@link #cancelDownload(DownloadRequest)}. If this is not done, +     * an {@link MbmsException} will be thrown with code       * {@link MbmsException#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT}       *       * The {@link File} supplied as a root temp file directory must already exist. If not, an @@ -444,20 +464,30 @@ public class MbmsDownloadManager {      }      /** -     * Gets information about current and known upcoming downloads. +     * Gets information about the status of a file pending download.       * -     * 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. +     * If the middleware has not yet been properly initialized or if it has no records of the +     * file indicated by {@code fileInfo} being associated with {@code downloadRequest}, +     * {@link #STATUS_UNKNOWN} will be returned.       * -     * May throw an IllegalArgumentException or RemoteException. -     * -     * If the DownloadRequest is unknown the results will be null. +     * @param downloadRequest The download request to query. +     * @param fileInfo The particular file within the request to get information on. +     * @return The status of the download.       */ -    public DownloadStatus getDownloadStatus(DownloadRequest downloadRequest) { -        return null; +    @DownloadStatus +    public int getDownloadStatus(DownloadRequest downloadRequest, FileInfo fileInfo) +            throws MbmsException { +        IMbmsDownloadService downloadService = mService.get(); +        if (downloadService == null) { +            throw new MbmsException(MbmsException.ERROR_MIDDLEWARE_NOT_BOUND); +        } + +        try { +            return downloadService.getDownloadStatus(downloadRequest, fileInfo); +        } catch (RemoteException e) { +            mService.set(null); +            throw new MbmsException(MbmsException.ERROR_SERVICE_LOST); +        }      }      /** diff --git a/telephony/java/android/telephony/mbms/DownloadStatus.aidl b/telephony/java/android/telephony/mbms/DownloadStatus.aidl deleted file mode 100755 index e7cfd391dade..000000000000 --- a/telephony/java/android/telephony/mbms/DownloadStatus.aidl +++ /dev/null @@ -1,19 +0,0 @@ -/* -** Copyright 2017, 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.mbms; - -parcelable DownloadStatus; diff --git a/telephony/java/android/telephony/mbms/DownloadStatus.java b/telephony/java/android/telephony/mbms/DownloadStatus.java deleted file mode 100644 index 90eb53f3f59e..000000000000 --- a/telephony/java/android/telephony/mbms/DownloadStatus.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2017 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.mbms; - -import android.os.Parcel; -import android.os.Parcelable; - -/** - * A Parcelable class describing the status of a Cell-Broadcast download request - * @hide - */ -public class DownloadStatus implements Parcelable { -    // includes downloads and active repair work -    public final int activelyDownloading; - -    // files scheduled for future broadcast -    public final int pendingDownloads; - -    // files scheduled for future repairs -    public final int pendingRepairs; - -    // is a future download window scheduled with unknown -    // number of files -    public final boolean windowPending; - -    public DownloadStatus(int downloading, int downloads, int repairs, boolean window) { -        activelyDownloading = downloading; -        pendingDownloads = downloads; -        pendingRepairs = repairs; -        windowPending = window; -    } - -    public static final Parcelable.Creator<DownloadStatus> CREATOR = -            new Parcelable.Creator<DownloadStatus>() { -        @Override -        public DownloadStatus createFromParcel(Parcel in) { -            return new DownloadStatus(in); -        } - -        @Override -        public DownloadStatus[] newArray(int size) { -            return new DownloadStatus[size]; -        } -    }; - -    DownloadStatus(Parcel in) { -        activelyDownloading = in.readInt(); -        pendingDownloads = in.readInt(); -        pendingRepairs = in.readInt(); -        windowPending = (in.readInt() == 1); -    } - -    public void writeToParcel(Parcel dest, int flags) { -        dest.writeInt(activelyDownloading); -        dest.writeInt(pendingDownloads); -        dest.writeInt(pendingRepairs); -        dest.writeInt((windowPending ? 1 : 0)); -    } - -    public int describeContents() { -        return 0; -    } -} diff --git a/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl b/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl index 7112e13d5650..06be8a011203 100755 --- a/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl +++ b/telephony/java/android/telephony/mbms/vendor/IMbmsDownloadService.aidl @@ -19,7 +19,7 @@ package android.telephony.mbms.vendor;  import android.app.PendingIntent;  import android.net.Uri;  import android.telephony.mbms.DownloadRequest; -import android.telephony.mbms.DownloadStatus; +import android.telephony.mbms.FileInfo;  import android.telephony.mbms.IMbmsDownloadManagerCallback;  import android.telephony.mbms.IDownloadCallback; @@ -41,7 +41,7 @@ interface IMbmsDownloadService      int cancelDownload(in DownloadRequest downloadRequest); -    DownloadStatus getDownloadStatus(in DownloadRequest downloadRequest); +    int getDownloadStatus(in DownloadRequest downloadRequest, in FileInfo fileInfo);      /*       * named this for 2 reasons: diff --git a/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java index 58bda6480999..305d38780ffc 100644 --- a/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java +++ b/telephony/java/android/telephony/mbms/vendor/MbmsDownloadServiceBase.java @@ -18,7 +18,7 @@ package android.telephony.mbms.vendor;  import android.os.RemoteException;  import android.telephony.mbms.DownloadRequest; -import android.telephony.mbms.DownloadStatus; +import android.telephony.mbms.FileInfo;  import android.telephony.mbms.IDownloadCallback;  import android.telephony.mbms.IMbmsDownloadManagerCallback;  import android.telephony.mbms.MbmsException; @@ -73,9 +73,15 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub {       * Sets the temp file root directory for this app/subscriptionId combination. The middleware       * should persist {@code rootDirectoryPath} and send it back when sending intents to the       * app's {@link android.telephony.mbms.MbmsDownloadReceiver}. +     * +     * If the calling app (as identified by the calling UID) currently has any pending download +     * requests that have not been canceled, the middleware must return +     * {@link MbmsException#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT} here. +     *       * @param subscriptionId The subscription id the download is operating under.       * @param rootDirectoryPath The path to the app's temp file root directory. -     * @return {@link MbmsException#ERROR_MIDDLEWARE_NOT_YET_READY}, +     * @return {@link MbmsException#SUCCESS}, +     *         {@link MbmsException#ERROR_MIDDLEWARE_NOT_YET_READY},       *         {@link MbmsException#ERROR_CANNOT_CHANGE_TEMP_FILE_ROOT},       *         or {@link MbmsException#ERROR_CONCURRENT_SERVICE_LIMIT_REACHED}       */ @@ -87,6 +93,11 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub {      /**       * Issues a request to download a set of files. +     * +     * The middleware should expect that {@link #setTempFileRootDirectory(int, String)} has been +     * called for this app between when the app was installed and when this method is called. If +     * this is not the case, an {@link IllegalStateException} may be thrown. +     *       * @param downloadRequest An object describing the set of files to be downloaded.       * @param listener A listener through which the middleware can provide progress updates to       *                 the app while both are still running. @@ -122,9 +133,9 @@ public class MbmsDownloadServiceBase extends IMbmsDownloadService.Stub {      }      @Override -    public DownloadStatus getDownloadStatus(DownloadRequest downloadRequest) +    public int getDownloadStatus(DownloadRequest downloadRequest, FileInfo fileInfo)              throws RemoteException { -        return null; +        return 0;      }      @Override |