Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 99affb33 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Tuner API: modify permission check" into rvc-dev am: ae73c6c7 am: 37b23894

Change-Id: Icc9b9aa9ed2a46113431f2622dbc222845c72ad6
parents b18cb3cc 37b23894
Loading
Loading
Loading
Loading
+28 −28
Original line number Diff line number Diff line
@@ -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
+0 −11
Original line number Diff line number Diff line
@@ -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();
    }
}
+54 −46
Original line number Diff line number Diff line
@@ -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;
    }
+1 −0
Original line number Diff line number Diff line
@@ -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.");
+1 −0
Original line number Diff line number Diff line
@@ -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");
            }