diff --git a/api/system-current.txt b/api/system-current.txt index 0edf9ab40821c..d5374f0533a7b 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -3972,6 +3972,15 @@ package android.media.soundtrigger { package android.media.tv { + public final class DvbDeviceInfo implements android.os.Parcelable { + ctor public DvbDeviceInfo(int, int); + method public int describeContents(); + method public int getAdapterId(); + method public int getDeviceId(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + } + public final class TvContentRatingSystemInfo implements android.os.Parcelable { method public static android.media.tv.TvContentRatingSystemInfo createTvContentRatingSystemInfo(int, android.content.pm.ApplicationInfo); method public int describeContents(); @@ -4086,12 +4095,14 @@ package android.media.tv { method @RequiresPermission(android.Manifest.permission.MODIFY_PARENTAL_CONTROLS) public void addBlockedRating(@NonNull android.media.tv.TvContentRating); method @RequiresPermission(android.Manifest.permission.CAPTURE_TV_INPUT) public boolean captureFrame(String, android.view.Surface, android.media.tv.TvStreamConfig); method @RequiresPermission(android.Manifest.permission.CAPTURE_TV_INPUT) public java.util.List getAvailableTvStreamConfigList(String); + method @NonNull @RequiresPermission("android.permission.DVB_DEVICE") public java.util.List getDvbDeviceList(); method @RequiresPermission(android.Manifest.permission.TV_INPUT_HARDWARE) public java.util.List getHardwareList(); method @RequiresPermission(android.Manifest.permission.READ_CONTENT_RATING_SYSTEMS) public java.util.List getTvContentRatingSystemList(); method @RequiresPermission(android.Manifest.permission.CAPTURE_TV_INPUT) public boolean isSingleSessionActive(); method @RequiresPermission(android.Manifest.permission.NOTIFY_TV_INPUTS) public void notifyPreviewProgramAddedToWatchNext(String, long, long); method @RequiresPermission(android.Manifest.permission.NOTIFY_TV_INPUTS) public void notifyPreviewProgramBrowsableDisabled(String, long); method @RequiresPermission(android.Manifest.permission.NOTIFY_TV_INPUTS) public void notifyWatchNextProgramBrowsableDisabled(String, long); + method @Nullable @RequiresPermission("android.permission.DVB_DEVICE") public android.os.ParcelFileDescriptor openDvbDevice(@NonNull android.media.tv.DvbDeviceInfo, int); method @RequiresPermission(android.Manifest.permission.TV_INPUT_HARDWARE) public void releaseTvInputHardware(int, android.media.tv.TvInputManager.Hardware); method @RequiresPermission(android.Manifest.permission.MODIFY_PARENTAL_CONTROLS) public void removeBlockedRating(@NonNull android.media.tv.TvContentRating); method @RequiresPermission(android.Manifest.permission.MODIFY_PARENTAL_CONTROLS) public void setParentalControlsEnabled(boolean); diff --git a/media/java/android/media/tv/DvbDeviceInfo.java b/media/java/android/media/tv/DvbDeviceInfo.java index a574fe18fb639..96c852812a74f 100644 --- a/media/java/android/media/tv/DvbDeviceInfo.java +++ b/media/java/android/media/tv/DvbDeviceInfo.java @@ -16,6 +16,8 @@ package android.media.tv; +import android.annotation.NonNull; +import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; import android.util.Log; @@ -26,10 +28,11 @@ import android.util.Log; * * @hide */ +@SystemApi public final class DvbDeviceInfo implements Parcelable { static final String TAG = "DvbDeviceInfo"; - public static final @android.annotation.NonNull Parcelable.Creator CREATOR = + public static final @NonNull Parcelable.Creator CREATOR = new Parcelable.Creator() { @Override public DvbDeviceInfo createFromParcel(Parcel source) { @@ -86,7 +89,7 @@ public final class DvbDeviceInfo implements Parcelable { } @Override - public void writeToParcel(Parcel dest, int flags) { + public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeInt(mAdapterId); dest.writeInt(mDeviceId); } diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java index d22a298935404..854ea43f17c3d 100644 --- a/media/java/android/media/tv/TvInputManager.java +++ b/media/java/android/media/tv/TvInputManager.java @@ -101,6 +101,12 @@ public final class TvInputManager { */ public static final int DVB_DEVICE_FRONTEND = DVB_DEVICE_END; + /** @hide */ + @Retention(RetentionPolicy.SOURCE) + @IntDef({DVB_DEVICE_DEMUX, DVB_DEVICE_DVR, DVB_DEVICE_FRONTEND}) + public @interface DvbDeviceType {} + + /** @hide */ @Retention(RetentionPolicy.SOURCE) @IntDef({VIDEO_UNAVAILABLE_REASON_UNKNOWN, VIDEO_UNAVAILABLE_REASON_TUNING, @@ -1663,6 +1669,9 @@ public final class TvInputManager { * @return the list of {@link DvbDeviceInfo} objects representing available DVB devices. * @hide */ + @SystemApi + @RequiresPermission(android.Manifest.permission.DVB_DEVICE) + @NonNull public List getDvbDeviceList() { try { return mService.getDvbDeviceList(); @@ -1676,19 +1685,24 @@ public final class TvInputManager { * {@link DvbDeviceInfo} * * @param info A {@link DvbDeviceInfo} to open a DVB device. - * @param device A DVB device. The DVB device can be {@link #DVB_DEVICE_DEMUX}, + * @param deviceType A DVB device type. The type can be {@link #DVB_DEVICE_DEMUX}, * {@link #DVB_DEVICE_DVR} or {@link #DVB_DEVICE_FRONTEND}. * @return a {@link ParcelFileDescriptor} of a specified DVB device for a given - * {@link DvbDeviceInfo}, or {@code null} if the given {@link DvbDeviceInfo} was invalid - * or the specified DVB device was busy with a previous request. + * {@link DvbDeviceInfo}, or {@code null} if the given {@link DvbDeviceInfo} + * failed to open. + * @throws IllegalArgumentException if {@code deviceType} is invalid or the device is not found. * @hide */ - public ParcelFileDescriptor openDvbDevice(DvbDeviceInfo info, int device) { + @SystemApi + @RequiresPermission(android.Manifest.permission.DVB_DEVICE) + @Nullable + public ParcelFileDescriptor openDvbDevice(@NonNull DvbDeviceInfo info, + @DvbDeviceType int deviceType) { try { - if (DVB_DEVICE_START > device || DVB_DEVICE_END < device) { - throw new IllegalArgumentException("Invalid DVB device: " + device); + if (DVB_DEVICE_START > deviceType || DVB_DEVICE_END < deviceType) { + throw new IllegalArgumentException("Invalid DVB device: " + deviceType); } - return mService.openDvbDevice(info, device); + return mService.openDvbDevice(info, deviceType); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java index 18ed51a6cd5e3..5b58199aec4f0 100755 --- a/services/core/java/com/android/server/tv/TvInputManagerService.java +++ b/services/core/java/com/android/server/tv/TvInputManagerService.java @@ -1814,8 +1814,8 @@ public final class TvInputManagerService extends SystemService { } @Override - public ParcelFileDescriptor openDvbDevice(DvbDeviceInfo info, int device) - throws RemoteException { + public ParcelFileDescriptor openDvbDevice(DvbDeviceInfo info, + @TvInputManager.DvbDeviceType int deviceType) throws RemoteException { if (mContext.checkCallingPermission(android.Manifest.permission.DVB_DEVICE) != PackageManager.PERMISSION_GRANTED) { throw new SecurityException("Requires DVB_DEVICE permission"); @@ -1852,7 +1852,7 @@ public final class TvInputManagerService extends SystemService { final long identity = Binder.clearCallingIdentity(); try { String deviceFileName; - switch (device) { + switch (deviceType) { case TvInputManager.DVB_DEVICE_DEMUX: deviceFileName = String.format(dvbDeviceFound ? "/dev/dvb/adapter%d/demux%d" : "/dev/dvb%d.demux%d", @@ -1869,14 +1869,14 @@ public final class TvInputManagerService extends SystemService { info.getAdapterId(), info.getDeviceId()); break; default: - throw new IllegalArgumentException("Invalid DVB device: " + device); + throw new IllegalArgumentException("Invalid DVB device: " + deviceType); } try { // The DVB frontend device only needs to be opened in read/write mode, which // allows performing tuning operations. The DVB demux and DVR device are enough // to be opened in read only mode. return ParcelFileDescriptor.open(new File(deviceFileName), - TvInputManager.DVB_DEVICE_FRONTEND == device + TvInputManager.DVB_DEVICE_FRONTEND == deviceType ? ParcelFileDescriptor.MODE_READ_WRITE : ParcelFileDescriptor.MODE_READ_ONLY); } catch (FileNotFoundException e) {