Merge "Tuner API: modify permission check" into rvc-dev

This commit is contained in:
TreeHugger Robot
2020-03-18 23:38:40 +00:00
committed by Android (Google) Code Review
5 changed files with 84 additions and 85 deletions

View File

@@ -4827,11 +4827,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
@@ -4859,32 +4859,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

View File

@@ -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();
}
}

View File

@@ -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;
}

View File

@@ -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.");

View File

@@ -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");
}