From 76d362349704ddcdb524c922ab66630db0637ddb Mon Sep 17 00:00:00 2001 From: shubang Date: Tue, 17 Mar 2020 18:59:24 -0700 Subject: [PATCH] Tuner API: modify permission check 1. remove @RequiresPermission of non-static methods since it checks permission in the constructor. 2. check permission in system process instead of app process, such as: https://cs.corp.google.com/master-arc-dev/frameworks/base/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java?type=cs&q=ACCESS_TV_DESCRAMBLER&g=0&l=684 Bug: 149785806 Test: mmm; Change-Id: I034b5a75f7c8962dbc6c92a573f999a2853082ed --- api/system-current.txt | 56 +++++----- media/java/android/media/tv/tuner/Lnb.java | 11 -- media/java/android/media/tv/tuner/Tuner.java | 100 ++++++++++-------- .../android/media/tv/tuner/TunerUtils.java | 1 + .../TunerResourceManagerService.java | 1 + 5 files changed, 84 insertions(+), 85 deletions(-) diff --git a/api/system-current.txt b/api/system-current.txt index f4e2a936f603f..325a2eefad424 100755 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4828,11 +4828,11 @@ package android.media.tv.tuner { } public class Lnb implements java.lang.AutoCloseable { - method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public void close(); - method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int sendDiseqcMessage(@NonNull byte[]); - method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int setSatellitePosition(int); - method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int setTone(int); - method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int setVoltage(int); + method public void close(); + method public int sendDiseqcMessage(@NonNull byte[]); + method public int setSatellitePosition(int); + method public int setTone(int); + method public int setVoltage(int); field public static final int EVENT_TYPE_DISEQC_RX_OVERFLOW = 0; // 0x0 field public static final int EVENT_TYPE_DISEQC_RX_PARITY_ERROR = 2; // 0x2 field public static final int EVENT_TYPE_DISEQC_RX_TIMEOUT = 1; // 0x1 @@ -4860,32 +4860,32 @@ package android.media.tv.tuner { public class Tuner implements java.lang.AutoCloseable { ctor @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public Tuner(@NonNull android.content.Context, @Nullable String, int); - method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int cancelScanning(); - method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int cancelTuning(); - method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public void clearOnTuneEventListener(); - method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public void clearResourceLostListener(); - method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public void close(); - method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int connectCiCam(int); - method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int disconnectCiCam(); - method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int getAvSyncHwId(@NonNull android.media.tv.tuner.filter.Filter); - method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public long getAvSyncTime(int); - method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public static android.media.tv.tuner.DemuxCapabilities getDemuxCapabilities(@NonNull android.content.Context); - method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public android.media.tv.tuner.frontend.FrontendInfo getFrontendInfo(); + method public int cancelScanning(); + method public int cancelTuning(); + method public void clearOnTuneEventListener(); + method public void clearResourceLostListener(); + method public void close(); + method public int connectCiCam(int); + method public int disconnectCiCam(); + method public int getAvSyncHwId(@NonNull android.media.tv.tuner.filter.Filter); + method public long getAvSyncTime(int); + method @Nullable public android.media.tv.tuner.DemuxCapabilities getDemuxCapabilities(); + method @Nullable public android.media.tv.tuner.frontend.FrontendInfo getFrontendInfo(); method @Nullable public android.media.tv.tuner.frontend.FrontendStatus getFrontendStatus(@NonNull int[]); method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_TV_DESCRAMBLER) public android.media.tv.tuner.Descrambler openDescrambler(); - method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public android.media.tv.tuner.dvr.DvrPlayback openDvrPlayback(long, @NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.dvr.OnPlaybackStatusChangedListener); - method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public android.media.tv.tuner.dvr.DvrRecorder openDvrRecorder(long, @NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.dvr.OnRecordStatusChangedListener); - method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public android.media.tv.tuner.filter.Filter openFilter(int, int, long, @Nullable java.util.concurrent.Executor, @Nullable android.media.tv.tuner.filter.FilterCallback); - method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public android.media.tv.tuner.Lnb openLnb(@NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.LnbCallback); - method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public android.media.tv.tuner.Lnb openLnbByName(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.LnbCallback); + method @Nullable public android.media.tv.tuner.dvr.DvrPlayback openDvrPlayback(long, @NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.dvr.OnPlaybackStatusChangedListener); + method @Nullable public android.media.tv.tuner.dvr.DvrRecorder openDvrRecorder(long, @NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.dvr.OnRecordStatusChangedListener); + method @Nullable public android.media.tv.tuner.filter.Filter openFilter(int, int, long, @Nullable java.util.concurrent.Executor, @Nullable android.media.tv.tuner.filter.FilterCallback); + method @Nullable public android.media.tv.tuner.Lnb openLnb(@NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.LnbCallback); + method @Nullable public android.media.tv.tuner.Lnb openLnbByName(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.LnbCallback); method @Nullable public android.media.tv.tuner.filter.TimeFilter openTimeFilter(); - method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int scan(@NonNull android.media.tv.tuner.frontend.FrontendSettings, int, @NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.frontend.ScanCallback); - method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int setLnaEnabled(boolean); - method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public void setOnTuneEventListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.frontend.OnTuneEventListener); - method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public void setResourceLostListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.Tuner.OnResourceLostListener); - method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public void shareFrontendFromTuner(@NonNull android.media.tv.tuner.Tuner); - method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int tune(@NonNull android.media.tv.tuner.frontend.FrontendSettings); - method @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public void updateResourcePriority(int, int); + method public int scan(@NonNull android.media.tv.tuner.frontend.FrontendSettings, int, @NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.frontend.ScanCallback); + method public int setLnaEnabled(boolean); + method public void setOnTuneEventListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.frontend.OnTuneEventListener); + method public void setResourceLostListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.tv.tuner.Tuner.OnResourceLostListener); + method public void shareFrontendFromTuner(@NonNull android.media.tv.tuner.Tuner); + method public int tune(@NonNull android.media.tv.tuner.frontend.FrontendSettings); + method public void updateResourcePriority(int, int); field public static final int INVALID_AV_SYNC_ID = -1; // 0xffffffff field public static final int INVALID_FILTER_ID = -1; // 0xffffffff field public static final int INVALID_STREAM_ID = 65535; // 0xffff diff --git a/media/java/android/media/tv/tuner/Lnb.java b/media/java/android/media/tv/tuner/Lnb.java index 525ee4d05ade4..9ce895e25b49b 100644 --- a/media/java/android/media/tv/tuner/Lnb.java +++ b/media/java/android/media/tv/tuner/Lnb.java @@ -19,7 +19,6 @@ package android.media.tv.tuner; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.content.Context; import android.hardware.tv.tuner.V1_0.Constants; @@ -173,10 +172,8 @@ public class Lnb implements AutoCloseable { * @param voltage the power voltage constant the Lnb to use. * @return result status of the operation. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) @Result public int setVoltage(@Voltage int voltage) { - TunerUtils.checkTunerPermission(mContext); return nativeSetVoltage(voltage); } @@ -186,10 +183,8 @@ public class Lnb implements AutoCloseable { * @param tone the tone mode the Lnb to use. * @return result status of the operation. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) @Result public int setTone(@Tone int tone) { - TunerUtils.checkTunerPermission(mContext); return nativeSetTone(tone); } @@ -199,10 +194,8 @@ public class Lnb implements AutoCloseable { * @param position the position the Lnb to use. * @return result status of the operation. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) @Result public int setSatellitePosition(@Position int position) { - TunerUtils.checkTunerPermission(mContext); return nativeSetSatellitePosition(position); } @@ -216,19 +209,15 @@ public class Lnb implements AutoCloseable { * * @return result status of the operation. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) @Result public int sendDiseqcMessage(@NonNull byte[] message) { - TunerUtils.checkTunerPermission(mContext); return nativeSendDiseqcMessage(message); } /** * Releases the LNB instance. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public void close() { - TunerUtils.checkTunerPermission(mContext); nativeClose(); } } diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java index d24d75260395a..262fe86b539a1 100644 --- a/media/java/android/media/tv/tuner/Tuner.java +++ b/media/java/android/media/tv/tuner/Tuner.java @@ -43,6 +43,8 @@ import android.media.tv.tuner.frontend.FrontendStatus.FrontendStatusType; import android.media.tv.tuner.frontend.OnTuneEventListener; import android.media.tv.tuner.frontend.ScanCallback; import android.media.tv.tunerresourcemanager.ResourceClientProfile; +import android.media.tv.tunerresourcemanager.TunerDemuxRequest; +import android.media.tv.tunerresourcemanager.TunerDescramblerRequest; import android.media.tv.tunerresourcemanager.TunerFrontendRequest; import android.media.tv.tunerresourcemanager.TunerLnbRequest; import android.media.tv.tunerresourcemanager.TunerResourceManager; @@ -218,6 +220,8 @@ public class Tuner implements AutoCloseable { @Nullable private Executor mOnResourceLostListenerExecutor; + private Integer mDemuxHandle; + private Integer mDescramblerHandle; private final TunerResourceManager.ResourcesReclaimListener mResourceListener = new TunerResourceManager.ResourcesReclaimListener() { @@ -255,7 +259,6 @@ public class Tuner implements AutoCloseable { * @param executor the executor on which the listener should be invoked. * @param listener the listener that will be run. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public void setResourceLostListener(@NonNull @CallbackExecutor Executor executor, @NonNull OnResourceLostListener listener) { Objects.requireNonNull(executor, "OnResourceLostListener must not be null"); @@ -267,7 +270,6 @@ public class Tuner implements AutoCloseable { /** * Removes the listener for resource lost. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public void clearResourceLostListener() { mOnResourceLostListener = null; mOnResourceLostListenerExecutor = null; @@ -278,7 +280,6 @@ public class Tuner implements AutoCloseable { * * @param tuner the Tuner instance to share frontend resource with. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public void shareFrontendFromTuner(@NonNull Tuner tuner) { // TODO: implementation. } @@ -294,7 +295,6 @@ public class Tuner implements AutoCloseable { * @param priority the new priority. * @param niceValue the nice value. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public void updateResourcePriority(int priority, int niceValue) { // TODO: implementation. } @@ -304,7 +304,6 @@ public class Tuner implements AutoCloseable { /** * Releases the Tuner instance. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) @Override public void close() { // TODO: implementation. @@ -429,10 +428,8 @@ public class Tuner implements AutoCloseable { * @throws SecurityException if the caller does not have appropriate permissions. * @see #tune(FrontendSettings) */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public void setOnTuneEventListener(@NonNull @CallbackExecutor Executor executor, @NonNull OnTuneEventListener eventListener) { - TunerUtils.checkTunerPermission(mContext); mOnTuneEventListener = eventListener; mOnTunerEventExecutor = executor; } @@ -443,7 +440,6 @@ public class Tuner implements AutoCloseable { * @throws SecurityException if the caller does not have appropriate permissions. * @see #setOnTuneEventListener(Executor, OnTuneEventListener) */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public void clearOnTuneEventListener() { TunerUtils.checkTunerPermission(mContext); mOnTuneEventListener = null; @@ -474,7 +470,6 @@ public class Tuner implements AutoCloseable { * @throws SecurityException if the caller does not have appropriate permissions. * @see #setOnTuneEventListener(Executor, OnTuneEventListener) */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) @Result public int tune(@NonNull FrontendSettings settings) { mFrontendType = settings.getType(); @@ -491,7 +486,6 @@ public class Tuner implements AutoCloseable { * * @return result status of the operation. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) @Result public int cancelTuning() { TunerUtils.checkTunerPermission(mContext); @@ -509,7 +503,6 @@ public class Tuner implements AutoCloseable { * @throws IllegalStateException if {@code scan} is called again before * {@link #cancelScanning()} is called. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) @Result public int scan(@NonNull FrontendSettings settings, @ScanType int scanType, @NonNull @CallbackExecutor Executor executor, @NonNull ScanCallback scanCallback) { @@ -537,10 +530,8 @@ public class Tuner implements AutoCloseable { * * @throws SecurityException if the caller does not have appropriate permissions. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) @Result public int cancelScanning() { - TunerUtils.checkTunerPermission(mContext); int retVal = nativeStopScan(); mScanCallback = null; mScanCallbackExecutor = null; @@ -548,11 +539,11 @@ public class Tuner implements AutoCloseable { } private boolean requestFrontend() { - int[] feId = new int[1]; + int[] feHandle = new int[1]; TunerFrontendRequest request = new TunerFrontendRequest(mClientId, mFrontendType); - boolean granted = mTunerResourceManager.requestFrontend(request, feId); + boolean granted = mTunerResourceManager.requestFrontend(request, feHandle); if (granted) { - mFrontendHandle = feId[0]; + mFrontendHandle = feHandle[0]; } return granted; } @@ -579,10 +570,8 @@ public class Tuner implements AutoCloseable { * * @return result status of the operation. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) @Result public int setLnaEnabled(boolean enable) { - TunerUtils.checkTunerPermission(mContext); return nativeSetLna(enable); } @@ -605,9 +594,8 @@ public class Tuner implements AutoCloseable { * @param filter the filter instance for the hardware sync ID. * @return the id of hardware A/V sync. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public int getAvSyncHwId(@NonNull Filter filter) { - TunerUtils.checkTunerPermission(mContext); + checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); Integer id = nativeGetAvSyncHwId(filter); return id == null ? INVALID_AV_SYNC_ID : id; } @@ -621,9 +609,8 @@ public class Tuner implements AutoCloseable { * @param avSyncHwId the hardware id of A/V sync. * @return the current timestamp of hardware A/V sync. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) public long getAvSyncTime(int avSyncHwId) { - TunerUtils.checkTunerPermission(mContext); + checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); Long time = nativeGetAvSyncTime(avSyncHwId); return time == null ? INVALID_TIMESTAMP : time; } @@ -637,10 +624,9 @@ public class Tuner implements AutoCloseable { * @param ciCamId specify CI-CAM Id to connect. * @return result status of the operation. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) @Result public int connectCiCam(int ciCamId) { - TunerUtils.checkTunerPermission(mContext); + checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); return nativeConnectCiCam(ciCamId); } @@ -651,10 +637,9 @@ public class Tuner implements AutoCloseable { * * @return result status of the operation. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) @Result public int disconnectCiCam() { - TunerUtils.checkTunerPermission(mContext); + checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); return nativeDisconnectCiCam(); } @@ -663,10 +648,9 @@ public class Tuner implements AutoCloseable { * * @return The frontend information. {@code null} if the operation failed. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) @Nullable public FrontendInfo getFrontendInfo() { - TunerUtils.checkTunerPermission(mContext); + checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND); if (mFrontend == null) { throw new IllegalStateException("frontend is not initialized"); } @@ -679,14 +663,11 @@ public class Tuner implements AutoCloseable { /** * Gets Demux capabilities. * - * @param context the context of the caller. * @return A {@link DemuxCapabilities} instance that represents the demux capabilities. * {@code null} if the operation failed. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) @Nullable - public static DemuxCapabilities getDemuxCapabilities(@NonNull Context context) { - TunerUtils.checkTunerPermission(context); + public DemuxCapabilities getDemuxCapabilities() { return nativeGetDemuxCapabilities(); } @@ -792,12 +773,11 @@ public class Tuner implements AutoCloseable { * @param cb the callback to receive notifications from filter. * @return the opened filter. {@code null} if the operation failed. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) @Nullable public Filter openFilter(@Type int mainType, @Subtype int subType, @BytesLong long bufferSize, @CallbackExecutor @Nullable Executor executor, @Nullable FilterCallback cb) { - TunerUtils.checkTunerPermission(mContext); + checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); Filter filter = nativeOpenFilter( mainType, TunerUtils.getFilterSubtype(mainType, subType), bufferSize); if (filter != null) { @@ -821,7 +801,6 @@ public class Tuner implements AutoCloseable { * @param cb the callback to receive notifications from LNB. * @return the opened LNB object. {@code null} if the operation failed. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) @Nullable public Lnb openLnb(@CallbackExecutor @NonNull Executor executor, @NonNull LnbCallback cb) { Objects.requireNonNull(executor, "executor must not be null"); @@ -840,23 +819,22 @@ public class Tuner implements AutoCloseable { * @param cb the callback to receive notifications from LNB. * @return the opened LNB object. {@code null} if the operation failed. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) @Nullable public Lnb openLnbByName(@NonNull String name, @CallbackExecutor @NonNull Executor executor, @NonNull LnbCallback cb) { Objects.requireNonNull(name, "LNB name must not be null"); Objects.requireNonNull(executor, "executor must not be null"); Objects.requireNonNull(cb, "LnbCallback must not be null"); - TunerUtils.checkTunerPermission(mContext); + checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_LNB); return nativeOpenLnbByName(name); } private boolean requestLnb() { - int[] lnbId = new int[1]; + int[] lnbHandle = new int[1]; TunerLnbRequest request = new TunerLnbRequest(mClientId); - boolean granted = mTunerResourceManager.requestLnb(request, lnbId); + boolean granted = mTunerResourceManager.requestLnb(request, lnbHandle); if (granted) { - mLnbHandle = lnbId[0]; + mLnbHandle = lnbHandle[0]; } return granted; } @@ -868,6 +846,7 @@ public class Tuner implements AutoCloseable { */ @Nullable public TimeFilter openTimeFilter() { + checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); return nativeOpenTimeFilter(); } @@ -885,7 +864,7 @@ public class Tuner implements AutoCloseable { @RequiresPermission(android.Manifest.permission.ACCESS_TV_DESCRAMBLER) @Nullable public Descrambler openDescrambler() { - TunerUtils.checkDescramblerPermission(mContext); + checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DESCRAMBLER); return nativeOpenDescrambler(); } @@ -899,7 +878,6 @@ public class Tuner implements AutoCloseable { * @param l the listener to receive notifications from DVR recorder. * @return the opened DVR recorder object. {@code null} if the operation failed. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) @Nullable public DvrRecorder openDvrRecorder( @BytesLong long bufferSize, @@ -907,7 +885,7 @@ public class Tuner implements AutoCloseable { @NonNull OnRecordStatusChangedListener l) { Objects.requireNonNull(executor, "executor must not be null"); Objects.requireNonNull(l, "OnRecordStatusChangedListener must not be null"); - TunerUtils.checkTunerPermission(mContext); + checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); DvrRecorder dvr = nativeOpenDvrRecorder(bufferSize); return dvr; } @@ -922,7 +900,6 @@ public class Tuner implements AutoCloseable { * @param l the listener to receive notifications from DVR recorder. * @return the opened DVR playback object. {@code null} if the operation failed. */ - @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) @Nullable public DvrPlayback openDvrPlayback( @BytesLong long bufferSize, @@ -930,13 +907,32 @@ public class Tuner implements AutoCloseable { @NonNull OnPlaybackStatusChangedListener l) { Objects.requireNonNull(executor, "executor must not be null"); Objects.requireNonNull(l, "OnPlaybackStatusChangedListener must not be null"); - TunerUtils.checkTunerPermission(mContext); + checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX); DvrPlayback dvr = nativeOpenDvrPlayback(bufferSize); return dvr; } + private boolean requestDemux() { + int[] demuxHandle = new int[1]; + TunerDemuxRequest request = new TunerDemuxRequest(mClientId); + boolean granted = mTunerResourceManager.requestDemux(request, demuxHandle); + if (granted) { + mDemuxHandle = demuxHandle[0]; + } + return granted; + } + + private boolean requestDescrambler() { + int[] descramblerHandle = new int[1]; + TunerDescramblerRequest request = new TunerDescramblerRequest(mClientId); + boolean granted = mTunerResourceManager.requestDescrambler(request, descramblerHandle); + if (granted) { + mDescramblerHandle = descramblerHandle[0]; + } + return granted; + } + private boolean checkResource(int resourceType) { - // TODO: demux and descrambler switch (resourceType) { case TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND: { if (mFrontendHandle == null && !requestFrontend()) { @@ -950,6 +946,18 @@ public class Tuner implements AutoCloseable { } break; } + case TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX: { + if (mDemuxHandle == null && !requestDemux()) { + return false; + } + break; + } + case TunerResourceManager.TUNER_RESOURCE_TYPE_DESCRAMBLER: { + if (mDescramblerHandle == null && !requestDescrambler()) { + return false; + } + break; + } } return true; } diff --git a/media/java/android/media/tv/tuner/TunerUtils.java b/media/java/android/media/tv/tuner/TunerUtils.java index c3be12a0bf5e9..a41b39725672f 100644 --- a/media/java/android/media/tv/tuner/TunerUtils.java +++ b/media/java/android/media/tv/tuner/TunerUtils.java @@ -60,6 +60,7 @@ public final class TunerUtils { * @throws SecurityException if the caller doesn't have the permission. */ public static void checkPermission(Context context, String permission) { + // TODO: remove checkPermission methods if (context.checkCallingOrSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) { throw new SecurityException("Caller must have " + permission + " permission."); diff --git a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java index 25585b3ae7947..7047a9eb6e5f1 100644 --- a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java +++ b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java @@ -100,6 +100,7 @@ public class TunerResourceManagerService extends SystemService { @NonNull IResourcesReclaimListener listener, @NonNull int[] clientId) throws RemoteException { enforceTrmAccessPermission("registerClientProfile"); + enforceTunerAccessPermission("registerClientProfile"); if (profile == null) { throw new RemoteException("ResourceClientProfile can't be null"); }