diff --git a/api/system-current.txt b/api/system-current.txt index 4cb5c7062e0b0..d8f739380678d 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -15,6 +15,7 @@ package android { field public static final String ACCESS_SHARED_LIBRARIES = "android.permission.ACCESS_SHARED_LIBRARIES"; field public static final String ACCESS_SHORTCUTS = "android.permission.ACCESS_SHORTCUTS"; field public static final String ACCESS_SURFACE_FLINGER = "android.permission.ACCESS_SURFACE_FLINGER"; + field public static final String ACCESS_TV_TUNER = "android.permission.ACCESS_TV_TUNER"; field public static final String ACTIVITY_EMBEDDING = "android.permission.ACTIVITY_EMBEDDING"; field public static final String ADJUST_RUNTIME_PERMISSIONS_POLICY = "android.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY"; field public static final String ALLOCATE_AGGRESSIVE = "android.permission.ALLOCATE_AGGRESSIVE"; @@ -4479,6 +4480,20 @@ package android.media.tv { } +package android.media.tv.tuner { + + public abstract class FrontendSettings { + method public final int getFrequency(); + method public abstract int getType(); + } + + public final class Tuner implements java.lang.AutoCloseable { + ctor public Tuner(@NonNull android.content.Context); + method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int tune(@NonNull android.media.tv.tuner.FrontendSettings); + } + +} + package android.metrics { public class LogMaker { diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index ee86c162ac6a4..c32f521d350d9 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -4715,6 +4715,12 @@ + + + plpSettings; + FrontendAtsc3Settings(int frequency) { + super(frequency); + } + @Override public int getType() { return TunerConstants.FRONTEND_TYPE_ATSC3; @@ -144,6 +167,7 @@ public abstract class FrontendSettings { /** * Frontend settings for DVBS. + * @hide */ public static class FrontendDvbsSettings extends FrontendSettings { public int modulation; @@ -154,6 +178,10 @@ public abstract class FrontendSettings { public int inputStreamId; public byte standard; + FrontendDvbsSettings(int frequency) { + super(frequency); + } + @Override public int getType() { return TunerConstants.FRONTEND_TYPE_DVBS; @@ -162,6 +190,7 @@ public abstract class FrontendSettings { /** * Frontend settings for DVBC. + * @hide */ public static class FrontendDvbcSettings extends FrontendSettings { public int modulation; @@ -171,6 +200,10 @@ public abstract class FrontendSettings { public byte annex; public int spectralInversion; + FrontendDvbcSettings(int frequency) { + super(frequency); + } + @Override public int getType() { return TunerConstants.FRONTEND_TYPE_DVBC; @@ -179,6 +212,7 @@ public abstract class FrontendSettings { /** * Frontend settings for DVBT. + * @hide */ public static class FrontendDvbtSettings extends FrontendSettings { public int transmissionMode; @@ -195,6 +229,10 @@ public abstract class FrontendSettings { public byte plpId; public byte plpGroupId; + FrontendDvbtSettings(int frequency) { + super(frequency); + } + @Override public int getType() { return TunerConstants.FRONTEND_TYPE_DVBT; @@ -203,6 +241,7 @@ public abstract class FrontendSettings { /** * Frontend settings for ISDBS. + * @hide */ public static class FrontendIsdbsSettings extends FrontendSettings { public int streamId; @@ -212,6 +251,10 @@ public abstract class FrontendSettings { public int symbolRate; public int rolloff; + FrontendIsdbsSettings(int frequency) { + super(frequency); + } + @Override public int getType() { return TunerConstants.FRONTEND_TYPE_ISDBS; @@ -220,6 +263,7 @@ public abstract class FrontendSettings { /** * Frontend settings for ISDBS-3. + * @hide */ public static class FrontendIsdbs3Settings extends FrontendSettings { public int streamId; @@ -229,6 +273,10 @@ public abstract class FrontendSettings { public int symbolRate; public int rolloff; + FrontendIsdbs3Settings(int frequency) { + super(frequency); + } + @Override public int getType() { return TunerConstants.FRONTEND_TYPE_ISDBS3; @@ -237,6 +285,7 @@ public abstract class FrontendSettings { /** * Frontend settings for ISDBT. + * @hide */ public static class FrontendIsdbtSettings extends FrontendSettings { public int modulation; @@ -245,6 +294,10 @@ public abstract class FrontendSettings { public int guardInterval; public int serviceAreaId; + FrontendIsdbtSettings(int frequency) { + super(frequency); + } + @Override public int getType() { return TunerConstants.FRONTEND_TYPE_ISDBT; @@ -253,6 +306,7 @@ public abstract class FrontendSettings { /** * PLP settings for ATSC-3. + * @hide */ public static class FrontendAtsc3PlpSettings { public byte plpId; @@ -264,6 +318,7 @@ public abstract class FrontendSettings { /** * Code rate for DVBS. + * @hide */ public static class FrontendDvbsCodeRate { public long fec; diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java index 4c93101bc0b5c..a41974416d096 100644 --- a/media/java/android/media/tv/tuner/Tuner.java +++ b/media/java/android/media/tv/tuner/Tuner.java @@ -18,6 +18,10 @@ package android.media.tv.tuner; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.RequiresPermission; +import android.annotation.SystemApi; +import android.content.Context; +import android.content.pm.PackageManager; import android.media.tv.tuner.TunerConstants.DemuxPidType; import android.os.Handler; import android.os.Looper; @@ -26,14 +30,20 @@ import android.os.Message; import java.util.List; /** - * Tuner is used to interact with tuner devices. + * This class is used to interact with hardware tuners devices. + * + *

Each TvInputService Session should create one instance of this class. + * + *

This class controls the TIS interaction with Tuner HAL. * * @hide */ +@SystemApi public final class Tuner implements AutoCloseable { private static final String TAG = "MediaTvTuner"; private static final boolean DEBUG = false; + private static final String PERMISSION = android.Manifest.permission.ACCESS_TV_TUNER; private static final int MSG_ON_FRONTEND_EVENT = 1; private static final int MSG_ON_FILTER_EVENT = 2; private static final int MSG_ON_FILTER_STATUS = 3; @@ -44,6 +54,8 @@ public final class Tuner implements AutoCloseable { nativeInit(); } + private final Context mContext; + private List mFrontendIds; private Frontend mFrontend; private EventHandler mHandler; @@ -51,12 +63,26 @@ public final class Tuner implements AutoCloseable { private List mLnbIds; private Lnb mLnb; - public Tuner() { + /** + * Constructs a Tuner instance. + * + * @param context context of the caller. + */ + public Tuner(@NonNull Context context) { + mContext = context; nativeSetup(); } + private void checkPermission() { + if (mContext.checkCallingOrSelfPermission(PERMISSION) + != PackageManager.PERMISSION_GRANTED) { + throw new SecurityException("Caller must have " + PERMISSION + " permission."); + } + } + private long mNativeContext; // used by native jMediaTuner + /** @hide */ @Override public void close() {} @@ -92,6 +118,8 @@ public final class Tuner implements AutoCloseable { /** * Frontend Callback. + * + * @hide */ public interface FrontendCallback { @@ -103,6 +131,8 @@ public final class Tuner implements AutoCloseable { /** * LNB Callback. + * + * @hide */ public interface LnbCallback { /** @@ -113,6 +143,8 @@ public final class Tuner implements AutoCloseable { /** * Frontend Callback. + * + * @hide */ public interface FilterCallback { /** @@ -123,6 +155,8 @@ public final class Tuner implements AutoCloseable { /** * DVR Callback. + * + * @hide */ public interface DvrCallback { /** @@ -177,7 +211,7 @@ public final class Tuner implements AutoCloseable { } } - protected class Frontend { + private class Frontend { private int mId; private FrontendCallback mCallback; @@ -210,9 +244,15 @@ public final class Tuner implements AutoCloseable { } /** - * Tunes the frontend to using the settings given. + * Tunes the frontend to the settings given. + * + * @return result status of tune operation. + * @throws SecurityException if the caller does not have appropriate permissions. + * TODO: add result constants or throw exceptions. */ + @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int tune(@NonNull FrontendSettings settings) { + checkPermission(); return nativeTune(settings.getType(), settings); } @@ -238,7 +278,8 @@ public final class Tuner implements AutoCloseable { } } - protected class Filter { + /** @hide */ + public class Filter { private long mNativeContext; private FilterCallback mCallback; int mId; @@ -297,7 +338,8 @@ public final class Tuner implements AutoCloseable { return filter; } - protected class Lnb { + /** @hide */ + public class Lnb { private int mId; private LnbCallback mCallback; @@ -338,7 +380,8 @@ public final class Tuner implements AutoCloseable { } } - protected class Descrambler { + /** @hide */ + public class Descrambler { private long mNativeContext; private native boolean nativeAddPid(int pidType, int pid, Filter filter); @@ -362,7 +405,8 @@ public final class Tuner implements AutoCloseable { } // TODO: consider splitting Dvr to Playback and Recording - protected class Dvr { + /** @hide */ + public class Dvr { private long mNativeContext; private DvrCallback mCallback;