/*
 * This file is auto-generated.  DO NOT MODIFY.
 * Using: out/host/linux-x86/bin/aidl --lang=java -Weverything -Wno-missing-permission-annotation --min_sdk_version current --ninja -d out/soong/.intermediates/frameworks/base/media/java/android/media/tv/tunerresourcemanager/tv_tuner_resource_manager_aidl_interface-java-source/gen/android/media/tv/tunerresourcemanager/ITunerResourceManager.java.d -o out/soong/.intermediates/frameworks/base/media/java/android/media/tv/tunerresourcemanager/tv_tuner_resource_manager_aidl_interface-java-source/gen -Nframeworks/base/media/java/android/media/tv/tunerresourcemanager/aidl frameworks/base/media/java/android/media/tv/tunerresourcemanager/aidl/android/media/tv/tunerresourcemanager/ITunerResourceManager.aidl
 */
package android.media.tv.tunerresourcemanager;
/**
 * Interface of the Tuner Resource Manager. It manages resources used by TV Tuners.
 * <p>Resources include:
 * <ul>
 * <li>TunerFrontend {@link android.media.tv.tuner.frontend}.
 * <li>TunerLnb {@link android.media.tv.tuner.Lnb}.
 * <li>MediaCas {@link android.media.MediaCas}.
 * <li>TvInputHardware {@link android.media.tv.TvInputHardwareInfo}.
 * <ul>
 * 
 * <p>Expected workflow is:
 * <ul>
 * <li>Tuner Java/MediaCas/TIF update resources of the current device with TRM.
 * <li>Client registers its profile through {@link #registerClientProfile(ResourceClientProfile,
 * IResourcesReclaimListener, int[])}.
 * <li>Client requests resources through request APIs.
 * <li>If the resource needs to be handed to a higher priority client from a lower priority
 * one, TRM calls IResourcesReclaimListener registered by the lower priority client to release
 * the resource.
 * <ul>
 * 
 * @hide
 */
public interface ITunerResourceManager extends android.os.IInterface
{
  /** Default implementation for ITunerResourceManager. */
  public static class Default implements android.media.tv.tunerresourcemanager.ITunerResourceManager
  {
    /**
     * This API is used by the client to register their profile with the Tuner Resource manager.
     * 
     * <p>The profile contains information that can show the base priority score of the client.
     * 
     * @param profile {@link ResourceClientProfile} profile of the current client
     * @param listener {@link IResourcesReclaimListener} a callback to
     *                 reclaim clients' resources when needed.
     * @param clientId returns a clientId from the resource manager when the
     *                 the client registers its profile.
     */
    @Override public void registerClientProfile(android.media.tv.tunerresourcemanager.ResourceClientProfile profile, android.media.tv.tunerresourcemanager.IResourcesReclaimListener listener, int[] clientId) throws android.os.RemoteException
    {
    }
    /**
     * This API is used by the client to unregister their profile with the Tuner Resource manager.
     * 
     * @param clientId the client id that needs to be unregistered.
     */
    @Override public void unregisterClientProfile(int clientId) throws android.os.RemoteException
    {
    }
    /**
     * Updates a registered client's priority and niceValue.
     * 
     * @param clientId the id of the client that is updating its profile.
     * @param priority the priority that the client would like to update to.
     * @param niceValue the nice value that the client would like to update to.
     * 
     * @return true if the update is successful.
     */
    @Override public boolean updateClientPriority(int clientId, int priority, int niceValue) throws android.os.RemoteException
    {
      return false;
    }
    /**
     * Checks if there is any unused frontend resource of the specified type.
     * 
     * @param frontendType the specific type of frontend resource to be checked for.
     * 
     * @return true if there is any unused resource of the specified type.
     */
    @Override public boolean hasUnusedFrontend(int frontendType) throws android.os.RemoteException
    {
      return false;
    }
    /**
     * Checks if the client has the lowest priority among the clients that are holding
     * the frontend resource of the specified type.
     * 
     * <p> When this function returns false, it means that there is at least one client with the
     * strictly lower priority (than clientId) that is reclaimable by the system.
     * 
     * @param clientId The client ID to be checked the priority for.
     * @param frontendType The specific frontend type to be checked for.
     * 
     * @return false if there is another client holding the frontend resource of the specified type
     * that can be reclaimed. Otherwise true.
     */
    @Override public boolean isLowestPriority(int clientId, int frontendType) throws android.os.RemoteException
    {
      return false;
    }
    /**
     * Updates the available Frontend resources information on the current device.
     * 
     * <p><strong>Note:</strong> This update must happen before the first
     * {@link #requestFrontend(TunerFrontendRequest,int[])} and {@link #releaseFrontend(int, int)}
     * call.
     * 
     * @param infos an array of the available {@link TunerFrontendInfo} information.
     */
    @Override public void setFrontendInfoList(android.media.tv.tunerresourcemanager.TunerFrontendInfo[] infos) throws android.os.RemoteException
    {
    }
    /**
     * Updates the available Cas resource information on the current device.
     * 
     * <p><strong>Note:</strong> This update must happen before the first
     * {@link #requestCasSession(CasSessionRequest, int[])} and {@link #releaseCasSession(int, int)}
     * call.
     * 
     * @param casSystemId id of the updating CAS system.
     * @param maxSessionNum the max session number of the CAS system that is updated.
     */
    @Override public void updateCasInfo(int casSystemId, int maxSessionNum) throws android.os.RemoteException
    {
    }
    /**
     * Updates the available Demux resources information on the current device.
     * 
     * <p><strong>Note:</strong> This update must happen before the first
     * {@link #requestDemux(TunerDemux,int[])} and {@link #releaseDemux(int, int)}
     * call.
     * 
     * @param infos an array of the available {@link TunerDemux} information.
     */
    @Override public void setDemuxInfoList(android.media.tv.tunerresourcemanager.TunerDemuxInfo[] infos) throws android.os.RemoteException
    {
    }
    /**
     * Updates the available Lnb resource information on the current device.
     * 
     * <p><strong>Note:</strong> This update must happen before the first
     * {@link #requestLnb(TunerLnbRequest, int[])} and {@link #releaseLnb(int, int)} call.
     * 
     * @param lnbIds ids of the updating lnbs.
     */
    @Override public void setLnbInfoList(int[] lnbIds) throws android.os.RemoteException
    {
    }
    /**
     * This API is used by the Tuner framework to request a frontend from the TunerHAL.
     * 
     * <p>There are two cases:
     * <ul>
     * <li>If the desiredId is not {@link TunerFrontendRequest#DEFAULT_DESIRED_ID}
     * <li><li>If the desired frontend with the given frontendType is available, the API would send
     * the id back.
     * <li><li>If the desired frontend with the given frontendType is in use but the current request
     * info can show higher priority than other uses of Frontend, the API will send
     * {@link IResourcesReclaimListener#onReclaimResources()} to the {@link Tuner}. Tuner would
     * handle the resource reclaim on the holder of lower priority and notify the holder of its
     * resource loss.
     * <li><li>If no frontend can be granted, the API would return false.
     * <ul>
     * 
     * <li>If the desiredId is {@link TunerFrontendRequest#DEFAULT_DESIRED_ID}
     * <li><li>If there is frontend available, the API would send the id back.
     * <li><li>If no Frontend is available but the current request info can show higher priority
     * than other uses of Frontend, the API will send
     * {@link IResourcesReclaimListener#onReclaimResources()} to the {@link Tuner}. Tuner would
     * handle the resource reclaim on the holder of lower priority and notify the holder of its
     * resource loss.
     * <li><li>If no frontend can be granted, the API would return false.
     * <ul>
     * 
     * <p><strong>Note:</strong> {@link #setFrontendInfoList(TunerFrontendInfo[])} must be called
     * before this request.
     * 
     * @param request {@link TunerFrontendRequest} information of the current request.
     * @param frontendHandle a one-element array to return the granted frontendHandle.
     * 
     * @return true if there is frontend granted.
     */
    @Override public boolean requestFrontend(android.media.tv.tunerresourcemanager.TunerFrontendRequest request, int[] frontendHandle) throws android.os.RemoteException
    {
      return false;
    }
    /**
     * Sets the maximum usable frontends number of a given frontend type. It is used to enable or
     * disable frontends when cable connection status is changed by user.
     * 
     * @param frontendType the frontendType which the maximum usable number will be set for.
     * @param maxNumber the new maximum usable number.
     * 
     * @return true if  successful and false otherwise.
     */
    @Override public boolean setMaxNumberOfFrontends(int frontendType, int maxNum) throws android.os.RemoteException
    {
      return false;
    }
    /**
     * Get the maximum usable frontends number of a given frontend type.
     * 
     * @param frontendType the frontendType which the maximum usable number will be queried for.
     * 
     * @return the maximum usable number of the queried frontend type. Returns -1 when the
     *         frontendType is invalid
     */
    @Override public int getMaxNumberOfFrontends(int frontendType) throws android.os.RemoteException
    {
      return 0;
    }
    /**
     * Requests to share frontend with an existing client.
     * 
     * <p><strong>Note:</strong> {@link #setFrontendInfoList(TunerFrontendInfo[])} must be called
     * before this request.
     * 
     * @param selfClientId the id of the client that sends the request.
     * @param targetClientId the id of the client to share the frontend with.
     */
    @Override public void shareFrontend(int selfClientId, int targetClientId) throws android.os.RemoteException
    {
    }
    /**
     * Transfers the ownership of the shared resource.
     * 
     * <p><strong>Note:</strong> Only the existing frontend sharee can be the new owner.
     * 
     * @param resourceType the type of resource to transfer the ownership for.
     * @param currentOwnerId the id of the current owner client.
     * @param newOwnerId the id of the new owner client.
     * 
     * @return true if successful. false otherwise.
     */
    @Override public boolean transferOwner(int resourceType, int currentOwnerId, int newOwnerId) throws android.os.RemoteException
    {
      return false;
    }
    /**
     * This API is used by the Tuner framework to request an available demux from the TunerHAL.
     * 
     * <p>There are three possible scenarios:
     * <ul>
     * <li>If there is demux available, the API would send the handle back.
     * 
     * <li>If no Demux is available but the current request info can show higher priority than
     * other uses of demuxes, the API will send
     * {@link IResourcesReclaimListener#onReclaimResources()} to the {@link Tuner}. Tuner would
     * handle the resource reclaim on the holder of lower priority and notify the holder of its
     * resource loss.
     * 
     * <li>If no demux can be granted, the API would return false.
     * <ul>
     * 
     * @param request {@link TunerDemuxRequest} information of the current request.
     * @param demuxHandle a one-element array to return the granted demux handle.
     * 
     * @return true if there is demux granted.
     */
    @Override public boolean requestDemux(android.media.tv.tunerresourcemanager.TunerDemuxRequest request, int[] demuxHandle) throws android.os.RemoteException
    {
      return false;
    }
    /**
     * This API is used by the Tuner framework to request an available descrambler from the
     * TunerHAL.
     * 
     * <p>There are three possible scenarios:
     * <ul>
     * <li>If there is descrambler available, the API would send the handle back.
     * 
     * <li>If no Descrambler is available but the current request info can show higher priority than
     * other uses of Descrambler, the API will send
     * {@link IResourcesReclaimListener#onReclaimResources()} to the {@link Tuner}. Tuner would
     * handle the resource reclaim on the holder of lower priority and notify the holder of its
     * resource loss.
     * 
     * <li>If no Descrambler can be granted, the API would return false.
     * <ul>
     * 
     * @param request {@link TunerDescramblerRequest} information of the current request.
     * @param descramblerHandle a one-element array to return the granted descrambler handle.
     * 
     * @return true if there is Descrambler granted.
     */
    @Override public boolean requestDescrambler(android.media.tv.tunerresourcemanager.TunerDescramblerRequest request, int[] descramblerHandle) throws android.os.RemoteException
    {
      return false;
    }
    /**
     * This API is used by the Tuner framework to request an available Cas session. This session
     * needs to be under the CAS system with the id indicated in the {@code request}.
     * 
     * <p>There are three possible scenarios:
     * <ul>
     * <li>If there is Cas session available, the API would send the id back.
     * 
     * <li>If no Cas session is available but the current request info can show higher priority than
     * other uses of the sessions under the requested CAS system, the API will send
     * {@link ITunerResourceManagerCallback#onReclaimResources()} to the {@link Tuner}. Tuner would
     * handle the resource reclaim on the holder of lower priority and notify the holder of its
     * resource loss.
     * 
     * <li>If no Cas session can be granted, the API would return false.
     * <ul>
     * 
     * <p><strong>Note:</strong> {@link #updateCasInfo(int, int)} must be called before this request.
     * 
     * @param request {@link CasSessionRequest} information of the current request.
     * @param casSessionHandle a one-element array to return the granted cas session handle.
     * 
     * @return true if there is CAS session granted.
     */
    @Override public boolean requestCasSession(android.media.tv.tunerresourcemanager.CasSessionRequest request, int[] casSessionHandle) throws android.os.RemoteException
    {
      return false;
    }
    /**
     * This API is used by the Tuner framework to request an available CuCam.
     * 
     * <p>There are three possible scenarios:
     * <ul>
     * <li>If there is CiCam available, the API would send the handle back.
     * 
     * <li>If no CiCma is available but the current request info can show higher priority than
     * other uses of the ciCam, the API will send
     * {@link ITunerResourceManagerCallback#onReclaimResources()} to the {@link Tuner}. Tuner would
     * handle the resource reclaim on the holder of lower priority and notify the holder of its
     * resource loss.
     * 
     * <li>If no CiCam can be granted, the API would return false.
     * <ul>
     * 
     * <p><strong>Note:</strong> {@link #updateCasInfo(int, int)} must be called before this request.
     * 
     * @param request {@link TunerCiCamRequest} information of the current request.
     * @param ciCamHandle a one-element array to return the granted ciCam handle.
     * 
     * @return true if there is CiCam granted.
     */
    @Override public boolean requestCiCam(android.media.tv.tunerresourcemanager.TunerCiCamRequest request, int[] ciCamHandle) throws android.os.RemoteException
    {
      return false;
    }
    /**
     * This API is used by the Tuner framework to request an available Lnb from the TunerHAL.
     * 
     * <p>There are three possible scenarios:
     * <ul>
     * <li>If there is Lnb available, the API would send the id back.
     * 
     * <li>If no Lnb is available but the current request has a higher priority than other uses of
     * lnbs, the API will send {@link ITunerResourceManagerCallback#onReclaimResources()} to the
     * {@link Tuner}. Tuner would handle the resource reclaim on the holder of lower priority and
     * notify the holder of its resource loss.
     * 
     * <li>If no Lnb system can be granted, the API would return false.
     * <ul>
     * 
     * <p><strong>Note:</strong> {@link #setLnbInfos(int[])} must be called before this request.
     * 
     * @param request {@link TunerLnbRequest} information of the current request.
     * @param lnbHandle a one-element array to return the granted Lnb handle.
     * 
     * @return true if there is Lnb granted.
     */
    @Override public boolean requestLnb(android.media.tv.tunerresourcemanager.TunerLnbRequest request, int[] lnbHandle) throws android.os.RemoteException
    {
      return false;
    }
    /**
     * Notifies the TRM that the given frontend has been released.
     * 
     * <p>Client must call this whenever it releases a Tuner frontend.
     * 
     * <p><strong>Note:</strong> {@link #setFrontendInfoList(TunerFrontendInfo[])} must be called
     * before this release.
     * 
     * @param frontendHandle the handle of the released frontend.
     * @param clientId the id of the client that is releasing the frontend.
     */
    @Override public void releaseFrontend(int frontendHandle, int clientId) throws android.os.RemoteException
    {
    }
    /**
     * Notifies the TRM that the Demux with the given handle was released.
     * 
     * <p>Client must call this whenever it releases a demux.
     * 
     * @param demuxHandle the handle of the released Tuner Demux.
     * @param clientId the id of the client that is releasing the demux.
     */
    @Override public void releaseDemux(int demuxHandle, int clientId) throws android.os.RemoteException
    {
    }
    /**
     * Notifies the TRM that the Descrambler with the given handle was released.
     * 
     * <p>Client must call this whenever it releases a descrambler.
     * 
     * @param descramblerHandle the handle of the released Tuner Descrambler.
     * @param clientId the id of the client that is releasing the descrambler.
     */
    @Override public void releaseDescrambler(int descramblerHandle, int clientId) throws android.os.RemoteException
    {
    }
    /**
     * Notifies the TRM that the given Cas session has been released.
     * 
     * <p>Client must call this whenever it releases a Cas session.
     * 
     * <p><strong>Note:</strong> {@link #updateCasInfo(int, int)} must be called before this release.
     * 
     * @param casSessionHandle the handle of the released CAS session.
     * @param clientId the id of the client that is releasing the cas session.
     */
    @Override public void releaseCasSession(int casSessionHandle, int clientId) throws android.os.RemoteException
    {
    }
    /**
     * Notifies the TRM that the given CiCam has been released.
     * 
     * <p>Client must call this whenever it releases a CiCam.
     * 
     * <p><strong>Note:</strong> {@link #updateCasInfo(int, int)} must be called before this
     * release.
     * 
     * @param ciCamHandle the handle of the releasing CiCam.
     * @param clientId the id of the client that is releasing the CiCam.
     */
    @Override public void releaseCiCam(int ciCamHandle, int clientId) throws android.os.RemoteException
    {
    }
    /**
     * Notifies the TRM that the Lnb with the given handle was released.
     * 
     * <p>Client must call this whenever it releases an Lnb.
     * 
     * <p><strong>Note:</strong> {@link #setLnbInfos(int[])} must be called before this release.
     * 
     * @param lnbHandle the handle of the released Tuner Lnb.
     * @param clientId the id of the client that is releasing the lnb.
     */
    @Override public void releaseLnb(int lnbHandle, int clientId) throws android.os.RemoteException
    {
    }
    /**
     * Compare two clients' priority.
     * 
     * @param challengerProfile the {@link ResourceClientProfile} of the challenger.
     * @param holderProfile the {@link ResourceClientProfile} of the holder of the resource.
     * 
     * @return true if the challenger has higher priority than the holder.
     */
    @Override public boolean isHigherPriority(android.media.tv.tunerresourcemanager.ResourceClientProfile challengerProfile, android.media.tv.tunerresourcemanager.ResourceClientProfile holderProfile) throws android.os.RemoteException
    {
      return false;
    }
    /**
     * Stores Frontend resource map for the later restore.
     * 
     * <p>This is API is only for testing purpose and should be used in pair with
     * restoreResourceMap(), which allows testing of {@link Tuner} APIs
     * that behave differently based on different sets of resource map.
     * 
     * @param resourceType The resource type to store the map for.
     */
    @Override public void storeResourceMap(int resourceType) throws android.os.RemoteException
    {
    }
    /**
     * Clears the frontend resource map.
     * 
     * <p>This is API is only for testing purpose and should be called right after
     * storeResourceMap(), so TRMService#removeFrontendResource() does not
     * get called in TRMService#setFrontendInfoListInternal() for custom frontend
     * resource map creation.
     * 
     * @param resourceType The resource type to clear the map for.
     */
    @Override public void clearResourceMap(int resourceType) throws android.os.RemoteException
    {
    }
    /**
     * Restores Frontend resource map if it was stored before.
     * 
     * <p>This is API is only for testing purpose and should be used in pair with
     * storeResourceMap(), which allows testing of {@link Tuner} APIs
     * that behave differently based on different sets of resource map.
     * 
     * @param resourceType The resource type to restore the map for.
     */
    @Override public void restoreResourceMap(int resourceType) throws android.os.RemoteException
    {
    }
    /**
     * Grants the lock to the caller for public {@link Tuner} APIs
     * 
     * <p>{@link Tuner} functions that call both [@link TunerResourceManager} APIs and
     * grabs lock that are also used in {@link IResourcesReclaimListener#onReclaimResources()}
     * must call this API before acquiring lock used in onReclaimResources().
     * 
     * <p>This API will block until it releases the lock or fails
     * 
     * @param clientId The ID of the caller.
     * 
     * @return true if the lock is granted. If false is returned, calling this API again is not
     * guaranteed to work and may be unrecoverrable. (This should not happen.)
     */
    @Override public boolean acquireLock(int clientId, long clientThreadId) throws android.os.RemoteException
    {
      return false;
    }
    /**
     * Releases the lock to the caller for public {@link Tuner} APIs
     * 
     * <p>This API must be called in pair with {@link #acquireLock(int, int)}
     * 
     * <p>This API will block until it releases the lock or fails
     * 
     * @param clientId The ID of the caller.
     * 
     * @return true if the lock is granted. If false is returned, calling this API again is not
     * guaranteed to work and may be unrecoverrable. (This should not happen.)
     */
    @Override public boolean releaseLock(int clientId) throws android.os.RemoteException
    {
      return false;
    }
    /**
     * Returns a priority for the given use case type and the client's foreground or background
     * status.
     * 
     * @param useCase the use case type of the client. When the given use case type is invalid,
     *        the default use case type will be used. {@see TvInputService#PriorityHintUseCaseType}.
     * @param pid the pid of the client. When the pid is invalid, background status will be used as
     *        a client's status. Otherwise, client's app corresponding to the given session id will
     *        be used as a client. {@see TvInputService#onCreateSession(String, String)}.
     * 
     * @return the client priority..
     */
    @Override public int getClientPriority(int useCase, int pid) throws android.os.RemoteException
    {
      return 0;
    }
    /**
     * Returns a config priority for the given use case type and the foreground or background
     * status.
     * 
     * @param useCase the use case type of the client. When the given use case type is invalid,
     *        the default use case type will be used. {@see TvInputService#PriorityHintUseCaseType}.
     * @param isForeground {@code true} if foreground, {@code false} otherwise.
     * 
     * @return the config priority.
     */
    @Override public int getConfigPriority(int useCase, boolean isForeground) throws android.os.RemoteException
    {
      return 0;
    }
    @Override
    public android.os.IBinder asBinder() {
      return null;
    }
  }
  /** Local-side IPC implementation stub class. */
  public static abstract class Stub extends android.os.Binder implements android.media.tv.tunerresourcemanager.ITunerResourceManager
  {
    /** Construct the stub at attach it to the interface. */
    @SuppressWarnings("this-escape")
    public Stub()
    {
      this.attachInterface(this, DESCRIPTOR);
    }
    /**
     * Cast an IBinder object into an android.media.tv.tunerresourcemanager.ITunerResourceManager interface,
     * generating a proxy if needed.
     */
    public static android.media.tv.tunerresourcemanager.ITunerResourceManager asInterface(android.os.IBinder obj)
    {
      if ((obj==null)) {
        return null;
      }
      android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
      if (((iin!=null)&&(iin instanceof android.media.tv.tunerresourcemanager.ITunerResourceManager))) {
        return ((android.media.tv.tunerresourcemanager.ITunerResourceManager)iin);
      }
      return new android.media.tv.tunerresourcemanager.ITunerResourceManager.Stub.Proxy(obj);
    }
    @Override public android.os.IBinder asBinder()
    {
      return this;
    }
    @Override public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException
    {
      java.lang.String descriptor = DESCRIPTOR;
      if (code >= android.os.IBinder.FIRST_CALL_TRANSACTION && code <= android.os.IBinder.LAST_CALL_TRANSACTION) {
        data.enforceInterface(descriptor);
      }
      if (code == INTERFACE_TRANSACTION) {
        reply.writeString(descriptor);
        return true;
      }
      switch (code)
      {
        case TRANSACTION_registerClientProfile:
        {
          android.media.tv.tunerresourcemanager.ResourceClientProfile _arg0;
          _arg0 = data.readTypedObject(android.media.tv.tunerresourcemanager.ResourceClientProfile.CREATOR);
          android.media.tv.tunerresourcemanager.IResourcesReclaimListener _arg1;
          _arg1 = android.media.tv.tunerresourcemanager.IResourcesReclaimListener.Stub.asInterface(data.readStrongBinder());
          int[] _arg2;
          int _arg2_length = data.readInt();
          if (_arg2_length < 0) {
            _arg2 = null;
          } else {
            _arg2 = new int[_arg2_length];
          }
          data.enforceNoDataAvail();
          this.registerClientProfile(_arg0, _arg1, _arg2);
          reply.writeNoException();
          reply.writeIntArray(_arg2);
          break;
        }
        case TRANSACTION_unregisterClientProfile:
        {
          int _arg0;
          _arg0 = data.readInt();
          data.enforceNoDataAvail();
          this.unregisterClientProfile(_arg0);
          reply.writeNoException();
          break;
        }
        case TRANSACTION_updateClientPriority:
        {
          int _arg0;
          _arg0 = data.readInt();
          int _arg1;
          _arg1 = data.readInt();
          int _arg2;
          _arg2 = data.readInt();
          data.enforceNoDataAvail();
          boolean _result = this.updateClientPriority(_arg0, _arg1, _arg2);
          reply.writeNoException();
          reply.writeBoolean(_result);
          break;
        }
        case TRANSACTION_hasUnusedFrontend:
        {
          int _arg0;
          _arg0 = data.readInt();
          data.enforceNoDataAvail();
          boolean _result = this.hasUnusedFrontend(_arg0);
          reply.writeNoException();
          reply.writeBoolean(_result);
          break;
        }
        case TRANSACTION_isLowestPriority:
        {
          int _arg0;
          _arg0 = data.readInt();
          int _arg1;
          _arg1 = data.readInt();
          data.enforceNoDataAvail();
          boolean _result = this.isLowestPriority(_arg0, _arg1);
          reply.writeNoException();
          reply.writeBoolean(_result);
          break;
        }
        case TRANSACTION_setFrontendInfoList:
        {
          android.media.tv.tunerresourcemanager.TunerFrontendInfo[] _arg0;
          _arg0 = data.createTypedArray(android.media.tv.tunerresourcemanager.TunerFrontendInfo.CREATOR);
          data.enforceNoDataAvail();
          this.setFrontendInfoList(_arg0);
          reply.writeNoException();
          break;
        }
        case TRANSACTION_updateCasInfo:
        {
          int _arg0;
          _arg0 = data.readInt();
          int _arg1;
          _arg1 = data.readInt();
          data.enforceNoDataAvail();
          this.updateCasInfo(_arg0, _arg1);
          reply.writeNoException();
          break;
        }
        case TRANSACTION_setDemuxInfoList:
        {
          android.media.tv.tunerresourcemanager.TunerDemuxInfo[] _arg0;
          _arg0 = data.createTypedArray(android.media.tv.tunerresourcemanager.TunerDemuxInfo.CREATOR);
          data.enforceNoDataAvail();
          this.setDemuxInfoList(_arg0);
          reply.writeNoException();
          break;
        }
        case TRANSACTION_setLnbInfoList:
        {
          int[] _arg0;
          _arg0 = data.createIntArray();
          data.enforceNoDataAvail();
          this.setLnbInfoList(_arg0);
          reply.writeNoException();
          break;
        }
        case TRANSACTION_requestFrontend:
        {
          android.media.tv.tunerresourcemanager.TunerFrontendRequest _arg0;
          _arg0 = data.readTypedObject(android.media.tv.tunerresourcemanager.TunerFrontendRequest.CREATOR);
          int[] _arg1;
          int _arg1_length = data.readInt();
          if (_arg1_length < 0) {
            _arg1 = null;
          } else {
            _arg1 = new int[_arg1_length];
          }
          data.enforceNoDataAvail();
          boolean _result = this.requestFrontend(_arg0, _arg1);
          reply.writeNoException();
          reply.writeBoolean(_result);
          reply.writeIntArray(_arg1);
          break;
        }
        case TRANSACTION_setMaxNumberOfFrontends:
        {
          int _arg0;
          _arg0 = data.readInt();
          int _arg1;
          _arg1 = data.readInt();
          data.enforceNoDataAvail();
          boolean _result = this.setMaxNumberOfFrontends(_arg0, _arg1);
          reply.writeNoException();
          reply.writeBoolean(_result);
          break;
        }
        case TRANSACTION_getMaxNumberOfFrontends:
        {
          int _arg0;
          _arg0 = data.readInt();
          data.enforceNoDataAvail();
          int _result = this.getMaxNumberOfFrontends(_arg0);
          reply.writeNoException();
          reply.writeInt(_result);
          break;
        }
        case TRANSACTION_shareFrontend:
        {
          int _arg0;
          _arg0 = data.readInt();
          int _arg1;
          _arg1 = data.readInt();
          data.enforceNoDataAvail();
          this.shareFrontend(_arg0, _arg1);
          reply.writeNoException();
          break;
        }
        case TRANSACTION_transferOwner:
        {
          int _arg0;
          _arg0 = data.readInt();
          int _arg1;
          _arg1 = data.readInt();
          int _arg2;
          _arg2 = data.readInt();
          data.enforceNoDataAvail();
          boolean _result = this.transferOwner(_arg0, _arg1, _arg2);
          reply.writeNoException();
          reply.writeBoolean(_result);
          break;
        }
        case TRANSACTION_requestDemux:
        {
          android.media.tv.tunerresourcemanager.TunerDemuxRequest _arg0;
          _arg0 = data.readTypedObject(android.media.tv.tunerresourcemanager.TunerDemuxRequest.CREATOR);
          int[] _arg1;
          int _arg1_length = data.readInt();
          if (_arg1_length < 0) {
            _arg1 = null;
          } else {
            _arg1 = new int[_arg1_length];
          }
          data.enforceNoDataAvail();
          boolean _result = this.requestDemux(_arg0, _arg1);
          reply.writeNoException();
          reply.writeBoolean(_result);
          reply.writeIntArray(_arg1);
          break;
        }
        case TRANSACTION_requestDescrambler:
        {
          android.media.tv.tunerresourcemanager.TunerDescramblerRequest _arg0;
          _arg0 = data.readTypedObject(android.media.tv.tunerresourcemanager.TunerDescramblerRequest.CREATOR);
          int[] _arg1;
          int _arg1_length = data.readInt();
          if (_arg1_length < 0) {
            _arg1 = null;
          } else {
            _arg1 = new int[_arg1_length];
          }
          data.enforceNoDataAvail();
          boolean _result = this.requestDescrambler(_arg0, _arg1);
          reply.writeNoException();
          reply.writeBoolean(_result);
          reply.writeIntArray(_arg1);
          break;
        }
        case TRANSACTION_requestCasSession:
        {
          android.media.tv.tunerresourcemanager.CasSessionRequest _arg0;
          _arg0 = data.readTypedObject(android.media.tv.tunerresourcemanager.CasSessionRequest.CREATOR);
          int[] _arg1;
          int _arg1_length = data.readInt();
          if (_arg1_length < 0) {
            _arg1 = null;
          } else {
            _arg1 = new int[_arg1_length];
          }
          data.enforceNoDataAvail();
          boolean _result = this.requestCasSession(_arg0, _arg1);
          reply.writeNoException();
          reply.writeBoolean(_result);
          reply.writeIntArray(_arg1);
          break;
        }
        case TRANSACTION_requestCiCam:
        {
          android.media.tv.tunerresourcemanager.TunerCiCamRequest _arg0;
          _arg0 = data.readTypedObject(android.media.tv.tunerresourcemanager.TunerCiCamRequest.CREATOR);
          int[] _arg1;
          int _arg1_length = data.readInt();
          if (_arg1_length < 0) {
            _arg1 = null;
          } else {
            _arg1 = new int[_arg1_length];
          }
          data.enforceNoDataAvail();
          boolean _result = this.requestCiCam(_arg0, _arg1);
          reply.writeNoException();
          reply.writeBoolean(_result);
          reply.writeIntArray(_arg1);
          break;
        }
        case TRANSACTION_requestLnb:
        {
          android.media.tv.tunerresourcemanager.TunerLnbRequest _arg0;
          _arg0 = data.readTypedObject(android.media.tv.tunerresourcemanager.TunerLnbRequest.CREATOR);
          int[] _arg1;
          int _arg1_length = data.readInt();
          if (_arg1_length < 0) {
            _arg1 = null;
          } else {
            _arg1 = new int[_arg1_length];
          }
          data.enforceNoDataAvail();
          boolean _result = this.requestLnb(_arg0, _arg1);
          reply.writeNoException();
          reply.writeBoolean(_result);
          reply.writeIntArray(_arg1);
          break;
        }
        case TRANSACTION_releaseFrontend:
        {
          int _arg0;
          _arg0 = data.readInt();
          int _arg1;
          _arg1 = data.readInt();
          data.enforceNoDataAvail();
          this.releaseFrontend(_arg0, _arg1);
          reply.writeNoException();
          break;
        }
        case TRANSACTION_releaseDemux:
        {
          int _arg0;
          _arg0 = data.readInt();
          int _arg1;
          _arg1 = data.readInt();
          data.enforceNoDataAvail();
          this.releaseDemux(_arg0, _arg1);
          reply.writeNoException();
          break;
        }
        case TRANSACTION_releaseDescrambler:
        {
          int _arg0;
          _arg0 = data.readInt();
          int _arg1;
          _arg1 = data.readInt();
          data.enforceNoDataAvail();
          this.releaseDescrambler(_arg0, _arg1);
          reply.writeNoException();
          break;
        }
        case TRANSACTION_releaseCasSession:
        {
          int _arg0;
          _arg0 = data.readInt();
          int _arg1;
          _arg1 = data.readInt();
          data.enforceNoDataAvail();
          this.releaseCasSession(_arg0, _arg1);
          reply.writeNoException();
          break;
        }
        case TRANSACTION_releaseCiCam:
        {
          int _arg0;
          _arg0 = data.readInt();
          int _arg1;
          _arg1 = data.readInt();
          data.enforceNoDataAvail();
          this.releaseCiCam(_arg0, _arg1);
          reply.writeNoException();
          break;
        }
        case TRANSACTION_releaseLnb:
        {
          int _arg0;
          _arg0 = data.readInt();
          int _arg1;
          _arg1 = data.readInt();
          data.enforceNoDataAvail();
          this.releaseLnb(_arg0, _arg1);
          reply.writeNoException();
          break;
        }
        case TRANSACTION_isHigherPriority:
        {
          android.media.tv.tunerresourcemanager.ResourceClientProfile _arg0;
          _arg0 = data.readTypedObject(android.media.tv.tunerresourcemanager.ResourceClientProfile.CREATOR);
          android.media.tv.tunerresourcemanager.ResourceClientProfile _arg1;
          _arg1 = data.readTypedObject(android.media.tv.tunerresourcemanager.ResourceClientProfile.CREATOR);
          data.enforceNoDataAvail();
          boolean _result = this.isHigherPriority(_arg0, _arg1);
          reply.writeNoException();
          reply.writeBoolean(_result);
          break;
        }
        case TRANSACTION_storeResourceMap:
        {
          int _arg0;
          _arg0 = data.readInt();
          data.enforceNoDataAvail();
          this.storeResourceMap(_arg0);
          reply.writeNoException();
          break;
        }
        case TRANSACTION_clearResourceMap:
        {
          int _arg0;
          _arg0 = data.readInt();
          data.enforceNoDataAvail();
          this.clearResourceMap(_arg0);
          reply.writeNoException();
          break;
        }
        case TRANSACTION_restoreResourceMap:
        {
          int _arg0;
          _arg0 = data.readInt();
          data.enforceNoDataAvail();
          this.restoreResourceMap(_arg0);
          reply.writeNoException();
          break;
        }
        case TRANSACTION_acquireLock:
        {
          int _arg0;
          _arg0 = data.readInt();
          long _arg1;
          _arg1 = data.readLong();
          data.enforceNoDataAvail();
          boolean _result = this.acquireLock(_arg0, _arg1);
          reply.writeNoException();
          reply.writeBoolean(_result);
          break;
        }
        case TRANSACTION_releaseLock:
        {
          int _arg0;
          _arg0 = data.readInt();
          data.enforceNoDataAvail();
          boolean _result = this.releaseLock(_arg0);
          reply.writeNoException();
          reply.writeBoolean(_result);
          break;
        }
        case TRANSACTION_getClientPriority:
        {
          int _arg0;
          _arg0 = data.readInt();
          int _arg1;
          _arg1 = data.readInt();
          data.enforceNoDataAvail();
          int _result = this.getClientPriority(_arg0, _arg1);
          reply.writeNoException();
          reply.writeInt(_result);
          break;
        }
        case TRANSACTION_getConfigPriority:
        {
          int _arg0;
          _arg0 = data.readInt();
          boolean _arg1;
          _arg1 = data.readBoolean();
          data.enforceNoDataAvail();
          int _result = this.getConfigPriority(_arg0, _arg1);
          reply.writeNoException();
          reply.writeInt(_result);
          break;
        }
        default:
        {
          return super.onTransact(code, data, reply, flags);
        }
      }
      return true;
    }
    private static class Proxy implements android.media.tv.tunerresourcemanager.ITunerResourceManager
    {
      private android.os.IBinder mRemote;
      Proxy(android.os.IBinder remote)
      {
        mRemote = remote;
      }
      @Override public android.os.IBinder asBinder()
      {
        return mRemote;
      }
      public java.lang.String getInterfaceDescriptor()
      {
        return DESCRIPTOR;
      }
      /**
       * This API is used by the client to register their profile with the Tuner Resource manager.
       * 
       * <p>The profile contains information that can show the base priority score of the client.
       * 
       * @param profile {@link ResourceClientProfile} profile of the current client
       * @param listener {@link IResourcesReclaimListener} a callback to
       *                 reclaim clients' resources when needed.
       * @param clientId returns a clientId from the resource manager when the
       *                 the client registers its profile.
       */
      @Override public void registerClientProfile(android.media.tv.tunerresourcemanager.ResourceClientProfile profile, android.media.tv.tunerresourcemanager.IResourcesReclaimListener listener, int[] clientId) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeTypedObject(profile, 0);
          _data.writeStrongInterface(listener);
          _data.writeInt(clientId.length);
          boolean _status = mRemote.transact(Stub.TRANSACTION_registerClientProfile, _data, _reply, 0);
          _reply.readException();
          _reply.readIntArray(clientId);
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      /**
       * This API is used by the client to unregister their profile with the Tuner Resource manager.
       * 
       * @param clientId the client id that needs to be unregistered.
       */
      @Override public void unregisterClientProfile(int clientId) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(clientId);
          boolean _status = mRemote.transact(Stub.TRANSACTION_unregisterClientProfile, _data, _reply, 0);
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      /**
       * Updates a registered client's priority and niceValue.
       * 
       * @param clientId the id of the client that is updating its profile.
       * @param priority the priority that the client would like to update to.
       * @param niceValue the nice value that the client would like to update to.
       * 
       * @return true if the update is successful.
       */
      @Override public boolean updateClientPriority(int clientId, int priority, int niceValue) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        boolean _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(clientId);
          _data.writeInt(priority);
          _data.writeInt(niceValue);
          boolean _status = mRemote.transact(Stub.TRANSACTION_updateClientPriority, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readBoolean();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      /**
       * Checks if there is any unused frontend resource of the specified type.
       * 
       * @param frontendType the specific type of frontend resource to be checked for.
       * 
       * @return true if there is any unused resource of the specified type.
       */
      @Override public boolean hasUnusedFrontend(int frontendType) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        boolean _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(frontendType);
          boolean _status = mRemote.transact(Stub.TRANSACTION_hasUnusedFrontend, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readBoolean();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      /**
       * Checks if the client has the lowest priority among the clients that are holding
       * the frontend resource of the specified type.
       * 
       * <p> When this function returns false, it means that there is at least one client with the
       * strictly lower priority (than clientId) that is reclaimable by the system.
       * 
       * @param clientId The client ID to be checked the priority for.
       * @param frontendType The specific frontend type to be checked for.
       * 
       * @return false if there is another client holding the frontend resource of the specified type
       * that can be reclaimed. Otherwise true.
       */
      @Override public boolean isLowestPriority(int clientId, int frontendType) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        boolean _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(clientId);
          _data.writeInt(frontendType);
          boolean _status = mRemote.transact(Stub.TRANSACTION_isLowestPriority, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readBoolean();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      /**
       * Updates the available Frontend resources information on the current device.
       * 
       * <p><strong>Note:</strong> This update must happen before the first
       * {@link #requestFrontend(TunerFrontendRequest,int[])} and {@link #releaseFrontend(int, int)}
       * call.
       * 
       * @param infos an array of the available {@link TunerFrontendInfo} information.
       */
      @Override public void setFrontendInfoList(android.media.tv.tunerresourcemanager.TunerFrontendInfo[] infos) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeTypedArray(infos, 0);
          boolean _status = mRemote.transact(Stub.TRANSACTION_setFrontendInfoList, _data, _reply, 0);
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      /**
       * Updates the available Cas resource information on the current device.
       * 
       * <p><strong>Note:</strong> This update must happen before the first
       * {@link #requestCasSession(CasSessionRequest, int[])} and {@link #releaseCasSession(int, int)}
       * call.
       * 
       * @param casSystemId id of the updating CAS system.
       * @param maxSessionNum the max session number of the CAS system that is updated.
       */
      @Override public void updateCasInfo(int casSystemId, int maxSessionNum) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(casSystemId);
          _data.writeInt(maxSessionNum);
          boolean _status = mRemote.transact(Stub.TRANSACTION_updateCasInfo, _data, _reply, 0);
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      /**
       * Updates the available Demux resources information on the current device.
       * 
       * <p><strong>Note:</strong> This update must happen before the first
       * {@link #requestDemux(TunerDemux,int[])} and {@link #releaseDemux(int, int)}
       * call.
       * 
       * @param infos an array of the available {@link TunerDemux} information.
       */
      @Override public void setDemuxInfoList(android.media.tv.tunerresourcemanager.TunerDemuxInfo[] infos) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeTypedArray(infos, 0);
          boolean _status = mRemote.transact(Stub.TRANSACTION_setDemuxInfoList, _data, _reply, 0);
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      /**
       * Updates the available Lnb resource information on the current device.
       * 
       * <p><strong>Note:</strong> This update must happen before the first
       * {@link #requestLnb(TunerLnbRequest, int[])} and {@link #releaseLnb(int, int)} call.
       * 
       * @param lnbIds ids of the updating lnbs.
       */
      @Override public void setLnbInfoList(int[] lnbIds) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeIntArray(lnbIds);
          boolean _status = mRemote.transact(Stub.TRANSACTION_setLnbInfoList, _data, _reply, 0);
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      /**
       * This API is used by the Tuner framework to request a frontend from the TunerHAL.
       * 
       * <p>There are two cases:
       * <ul>
       * <li>If the desiredId is not {@link TunerFrontendRequest#DEFAULT_DESIRED_ID}
       * <li><li>If the desired frontend with the given frontendType is available, the API would send
       * the id back.
       * <li><li>If the desired frontend with the given frontendType is in use but the current request
       * info can show higher priority than other uses of Frontend, the API will send
       * {@link IResourcesReclaimListener#onReclaimResources()} to the {@link Tuner}. Tuner would
       * handle the resource reclaim on the holder of lower priority and notify the holder of its
       * resource loss.
       * <li><li>If no frontend can be granted, the API would return false.
       * <ul>
       * 
       * <li>If the desiredId is {@link TunerFrontendRequest#DEFAULT_DESIRED_ID}
       * <li><li>If there is frontend available, the API would send the id back.
       * <li><li>If no Frontend is available but the current request info can show higher priority
       * than other uses of Frontend, the API will send
       * {@link IResourcesReclaimListener#onReclaimResources()} to the {@link Tuner}. Tuner would
       * handle the resource reclaim on the holder of lower priority and notify the holder of its
       * resource loss.
       * <li><li>If no frontend can be granted, the API would return false.
       * <ul>
       * 
       * <p><strong>Note:</strong> {@link #setFrontendInfoList(TunerFrontendInfo[])} must be called
       * before this request.
       * 
       * @param request {@link TunerFrontendRequest} information of the current request.
       * @param frontendHandle a one-element array to return the granted frontendHandle.
       * 
       * @return true if there is frontend granted.
       */
      @Override public boolean requestFrontend(android.media.tv.tunerresourcemanager.TunerFrontendRequest request, int[] frontendHandle) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        boolean _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeTypedObject(request, 0);
          _data.writeInt(frontendHandle.length);
          boolean _status = mRemote.transact(Stub.TRANSACTION_requestFrontend, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readBoolean();
          _reply.readIntArray(frontendHandle);
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      /**
       * Sets the maximum usable frontends number of a given frontend type. It is used to enable or
       * disable frontends when cable connection status is changed by user.
       * 
       * @param frontendType the frontendType which the maximum usable number will be set for.
       * @param maxNumber the new maximum usable number.
       * 
       * @return true if  successful and false otherwise.
       */
      @Override public boolean setMaxNumberOfFrontends(int frontendType, int maxNum) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        boolean _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(frontendType);
          _data.writeInt(maxNum);
          boolean _status = mRemote.transact(Stub.TRANSACTION_setMaxNumberOfFrontends, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readBoolean();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      /**
       * Get the maximum usable frontends number of a given frontend type.
       * 
       * @param frontendType the frontendType which the maximum usable number will be queried for.
       * 
       * @return the maximum usable number of the queried frontend type. Returns -1 when the
       *         frontendType is invalid
       */
      @Override public int getMaxNumberOfFrontends(int frontendType) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        int _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(frontendType);
          boolean _status = mRemote.transact(Stub.TRANSACTION_getMaxNumberOfFrontends, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readInt();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      /**
       * Requests to share frontend with an existing client.
       * 
       * <p><strong>Note:</strong> {@link #setFrontendInfoList(TunerFrontendInfo[])} must be called
       * before this request.
       * 
       * @param selfClientId the id of the client that sends the request.
       * @param targetClientId the id of the client to share the frontend with.
       */
      @Override public void shareFrontend(int selfClientId, int targetClientId) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(selfClientId);
          _data.writeInt(targetClientId);
          boolean _status = mRemote.transact(Stub.TRANSACTION_shareFrontend, _data, _reply, 0);
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      /**
       * Transfers the ownership of the shared resource.
       * 
       * <p><strong>Note:</strong> Only the existing frontend sharee can be the new owner.
       * 
       * @param resourceType the type of resource to transfer the ownership for.
       * @param currentOwnerId the id of the current owner client.
       * @param newOwnerId the id of the new owner client.
       * 
       * @return true if successful. false otherwise.
       */
      @Override public boolean transferOwner(int resourceType, int currentOwnerId, int newOwnerId) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        boolean _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(resourceType);
          _data.writeInt(currentOwnerId);
          _data.writeInt(newOwnerId);
          boolean _status = mRemote.transact(Stub.TRANSACTION_transferOwner, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readBoolean();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      /**
       * This API is used by the Tuner framework to request an available demux from the TunerHAL.
       * 
       * <p>There are three possible scenarios:
       * <ul>
       * <li>If there is demux available, the API would send the handle back.
       * 
       * <li>If no Demux is available but the current request info can show higher priority than
       * other uses of demuxes, the API will send
       * {@link IResourcesReclaimListener#onReclaimResources()} to the {@link Tuner}. Tuner would
       * handle the resource reclaim on the holder of lower priority and notify the holder of its
       * resource loss.
       * 
       * <li>If no demux can be granted, the API would return false.
       * <ul>
       * 
       * @param request {@link TunerDemuxRequest} information of the current request.
       * @param demuxHandle a one-element array to return the granted demux handle.
       * 
       * @return true if there is demux granted.
       */
      @Override public boolean requestDemux(android.media.tv.tunerresourcemanager.TunerDemuxRequest request, int[] demuxHandle) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        boolean _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeTypedObject(request, 0);
          _data.writeInt(demuxHandle.length);
          boolean _status = mRemote.transact(Stub.TRANSACTION_requestDemux, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readBoolean();
          _reply.readIntArray(demuxHandle);
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      /**
       * This API is used by the Tuner framework to request an available descrambler from the
       * TunerHAL.
       * 
       * <p>There are three possible scenarios:
       * <ul>
       * <li>If there is descrambler available, the API would send the handle back.
       * 
       * <li>If no Descrambler is available but the current request info can show higher priority than
       * other uses of Descrambler, the API will send
       * {@link IResourcesReclaimListener#onReclaimResources()} to the {@link Tuner}. Tuner would
       * handle the resource reclaim on the holder of lower priority and notify the holder of its
       * resource loss.
       * 
       * <li>If no Descrambler can be granted, the API would return false.
       * <ul>
       * 
       * @param request {@link TunerDescramblerRequest} information of the current request.
       * @param descramblerHandle a one-element array to return the granted descrambler handle.
       * 
       * @return true if there is Descrambler granted.
       */
      @Override public boolean requestDescrambler(android.media.tv.tunerresourcemanager.TunerDescramblerRequest request, int[] descramblerHandle) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        boolean _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeTypedObject(request, 0);
          _data.writeInt(descramblerHandle.length);
          boolean _status = mRemote.transact(Stub.TRANSACTION_requestDescrambler, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readBoolean();
          _reply.readIntArray(descramblerHandle);
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      /**
       * This API is used by the Tuner framework to request an available Cas session. This session
       * needs to be under the CAS system with the id indicated in the {@code request}.
       * 
       * <p>There are three possible scenarios:
       * <ul>
       * <li>If there is Cas session available, the API would send the id back.
       * 
       * <li>If no Cas session is available but the current request info can show higher priority than
       * other uses of the sessions under the requested CAS system, the API will send
       * {@link ITunerResourceManagerCallback#onReclaimResources()} to the {@link Tuner}. Tuner would
       * handle the resource reclaim on the holder of lower priority and notify the holder of its
       * resource loss.
       * 
       * <li>If no Cas session can be granted, the API would return false.
       * <ul>
       * 
       * <p><strong>Note:</strong> {@link #updateCasInfo(int, int)} must be called before this request.
       * 
       * @param request {@link CasSessionRequest} information of the current request.
       * @param casSessionHandle a one-element array to return the granted cas session handle.
       * 
       * @return true if there is CAS session granted.
       */
      @Override public boolean requestCasSession(android.media.tv.tunerresourcemanager.CasSessionRequest request, int[] casSessionHandle) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        boolean _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeTypedObject(request, 0);
          _data.writeInt(casSessionHandle.length);
          boolean _status = mRemote.transact(Stub.TRANSACTION_requestCasSession, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readBoolean();
          _reply.readIntArray(casSessionHandle);
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      /**
       * This API is used by the Tuner framework to request an available CuCam.
       * 
       * <p>There are three possible scenarios:
       * <ul>
       * <li>If there is CiCam available, the API would send the handle back.
       * 
       * <li>If no CiCma is available but the current request info can show higher priority than
       * other uses of the ciCam, the API will send
       * {@link ITunerResourceManagerCallback#onReclaimResources()} to the {@link Tuner}. Tuner would
       * handle the resource reclaim on the holder of lower priority and notify the holder of its
       * resource loss.
       * 
       * <li>If no CiCam can be granted, the API would return false.
       * <ul>
       * 
       * <p><strong>Note:</strong> {@link #updateCasInfo(int, int)} must be called before this request.
       * 
       * @param request {@link TunerCiCamRequest} information of the current request.
       * @param ciCamHandle a one-element array to return the granted ciCam handle.
       * 
       * @return true if there is CiCam granted.
       */
      @Override public boolean requestCiCam(android.media.tv.tunerresourcemanager.TunerCiCamRequest request, int[] ciCamHandle) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        boolean _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeTypedObject(request, 0);
          _data.writeInt(ciCamHandle.length);
          boolean _status = mRemote.transact(Stub.TRANSACTION_requestCiCam, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readBoolean();
          _reply.readIntArray(ciCamHandle);
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      /**
       * This API is used by the Tuner framework to request an available Lnb from the TunerHAL.
       * 
       * <p>There are three possible scenarios:
       * <ul>
       * <li>If there is Lnb available, the API would send the id back.
       * 
       * <li>If no Lnb is available but the current request has a higher priority than other uses of
       * lnbs, the API will send {@link ITunerResourceManagerCallback#onReclaimResources()} to the
       * {@link Tuner}. Tuner would handle the resource reclaim on the holder of lower priority and
       * notify the holder of its resource loss.
       * 
       * <li>If no Lnb system can be granted, the API would return false.
       * <ul>
       * 
       * <p><strong>Note:</strong> {@link #setLnbInfos(int[])} must be called before this request.
       * 
       * @param request {@link TunerLnbRequest} information of the current request.
       * @param lnbHandle a one-element array to return the granted Lnb handle.
       * 
       * @return true if there is Lnb granted.
       */
      @Override public boolean requestLnb(android.media.tv.tunerresourcemanager.TunerLnbRequest request, int[] lnbHandle) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        boolean _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeTypedObject(request, 0);
          _data.writeInt(lnbHandle.length);
          boolean _status = mRemote.transact(Stub.TRANSACTION_requestLnb, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readBoolean();
          _reply.readIntArray(lnbHandle);
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      /**
       * Notifies the TRM that the given frontend has been released.
       * 
       * <p>Client must call this whenever it releases a Tuner frontend.
       * 
       * <p><strong>Note:</strong> {@link #setFrontendInfoList(TunerFrontendInfo[])} must be called
       * before this release.
       * 
       * @param frontendHandle the handle of the released frontend.
       * @param clientId the id of the client that is releasing the frontend.
       */
      @Override public void releaseFrontend(int frontendHandle, int clientId) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(frontendHandle);
          _data.writeInt(clientId);
          boolean _status = mRemote.transact(Stub.TRANSACTION_releaseFrontend, _data, _reply, 0);
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      /**
       * Notifies the TRM that the Demux with the given handle was released.
       * 
       * <p>Client must call this whenever it releases a demux.
       * 
       * @param demuxHandle the handle of the released Tuner Demux.
       * @param clientId the id of the client that is releasing the demux.
       */
      @Override public void releaseDemux(int demuxHandle, int clientId) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(demuxHandle);
          _data.writeInt(clientId);
          boolean _status = mRemote.transact(Stub.TRANSACTION_releaseDemux, _data, _reply, 0);
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      /**
       * Notifies the TRM that the Descrambler with the given handle was released.
       * 
       * <p>Client must call this whenever it releases a descrambler.
       * 
       * @param descramblerHandle the handle of the released Tuner Descrambler.
       * @param clientId the id of the client that is releasing the descrambler.
       */
      @Override public void releaseDescrambler(int descramblerHandle, int clientId) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(descramblerHandle);
          _data.writeInt(clientId);
          boolean _status = mRemote.transact(Stub.TRANSACTION_releaseDescrambler, _data, _reply, 0);
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      /**
       * Notifies the TRM that the given Cas session has been released.
       * 
       * <p>Client must call this whenever it releases a Cas session.
       * 
       * <p><strong>Note:</strong> {@link #updateCasInfo(int, int)} must be called before this release.
       * 
       * @param casSessionHandle the handle of the released CAS session.
       * @param clientId the id of the client that is releasing the cas session.
       */
      @Override public void releaseCasSession(int casSessionHandle, int clientId) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(casSessionHandle);
          _data.writeInt(clientId);
          boolean _status = mRemote.transact(Stub.TRANSACTION_releaseCasSession, _data, _reply, 0);
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      /**
       * Notifies the TRM that the given CiCam has been released.
       * 
       * <p>Client must call this whenever it releases a CiCam.
       * 
       * <p><strong>Note:</strong> {@link #updateCasInfo(int, int)} must be called before this
       * release.
       * 
       * @param ciCamHandle the handle of the releasing CiCam.
       * @param clientId the id of the client that is releasing the CiCam.
       */
      @Override public void releaseCiCam(int ciCamHandle, int clientId) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(ciCamHandle);
          _data.writeInt(clientId);
          boolean _status = mRemote.transact(Stub.TRANSACTION_releaseCiCam, _data, _reply, 0);
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      /**
       * Notifies the TRM that the Lnb with the given handle was released.
       * 
       * <p>Client must call this whenever it releases an Lnb.
       * 
       * <p><strong>Note:</strong> {@link #setLnbInfos(int[])} must be called before this release.
       * 
       * @param lnbHandle the handle of the released Tuner Lnb.
       * @param clientId the id of the client that is releasing the lnb.
       */
      @Override public void releaseLnb(int lnbHandle, int clientId) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(lnbHandle);
          _data.writeInt(clientId);
          boolean _status = mRemote.transact(Stub.TRANSACTION_releaseLnb, _data, _reply, 0);
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      /**
       * Compare two clients' priority.
       * 
       * @param challengerProfile the {@link ResourceClientProfile} of the challenger.
       * @param holderProfile the {@link ResourceClientProfile} of the holder of the resource.
       * 
       * @return true if the challenger has higher priority than the holder.
       */
      @Override public boolean isHigherPriority(android.media.tv.tunerresourcemanager.ResourceClientProfile challengerProfile, android.media.tv.tunerresourcemanager.ResourceClientProfile holderProfile) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        boolean _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeTypedObject(challengerProfile, 0);
          _data.writeTypedObject(holderProfile, 0);
          boolean _status = mRemote.transact(Stub.TRANSACTION_isHigherPriority, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readBoolean();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      /**
       * Stores Frontend resource map for the later restore.
       * 
       * <p>This is API is only for testing purpose and should be used in pair with
       * restoreResourceMap(), which allows testing of {@link Tuner} APIs
       * that behave differently based on different sets of resource map.
       * 
       * @param resourceType The resource type to store the map for.
       */
      @Override public void storeResourceMap(int resourceType) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(resourceType);
          boolean _status = mRemote.transact(Stub.TRANSACTION_storeResourceMap, _data, _reply, 0);
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      /**
       * Clears the frontend resource map.
       * 
       * <p>This is API is only for testing purpose and should be called right after
       * storeResourceMap(), so TRMService#removeFrontendResource() does not
       * get called in TRMService#setFrontendInfoListInternal() for custom frontend
       * resource map creation.
       * 
       * @param resourceType The resource type to clear the map for.
       */
      @Override public void clearResourceMap(int resourceType) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(resourceType);
          boolean _status = mRemote.transact(Stub.TRANSACTION_clearResourceMap, _data, _reply, 0);
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      /**
       * Restores Frontend resource map if it was stored before.
       * 
       * <p>This is API is only for testing purpose and should be used in pair with
       * storeResourceMap(), which allows testing of {@link Tuner} APIs
       * that behave differently based on different sets of resource map.
       * 
       * @param resourceType The resource type to restore the map for.
       */
      @Override public void restoreResourceMap(int resourceType) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(resourceType);
          boolean _status = mRemote.transact(Stub.TRANSACTION_restoreResourceMap, _data, _reply, 0);
          _reply.readException();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
      }
      /**
       * Grants the lock to the caller for public {@link Tuner} APIs
       * 
       * <p>{@link Tuner} functions that call both [@link TunerResourceManager} APIs and
       * grabs lock that are also used in {@link IResourcesReclaimListener#onReclaimResources()}
       * must call this API before acquiring lock used in onReclaimResources().
       * 
       * <p>This API will block until it releases the lock or fails
       * 
       * @param clientId The ID of the caller.
       * 
       * @return true if the lock is granted. If false is returned, calling this API again is not
       * guaranteed to work and may be unrecoverrable. (This should not happen.)
       */
      @Override public boolean acquireLock(int clientId, long clientThreadId) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        boolean _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(clientId);
          _data.writeLong(clientThreadId);
          boolean _status = mRemote.transact(Stub.TRANSACTION_acquireLock, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readBoolean();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      /**
       * Releases the lock to the caller for public {@link Tuner} APIs
       * 
       * <p>This API must be called in pair with {@link #acquireLock(int, int)}
       * 
       * <p>This API will block until it releases the lock or fails
       * 
       * @param clientId The ID of the caller.
       * 
       * @return true if the lock is granted. If false is returned, calling this API again is not
       * guaranteed to work and may be unrecoverrable. (This should not happen.)
       */
      @Override public boolean releaseLock(int clientId) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        boolean _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(clientId);
          boolean _status = mRemote.transact(Stub.TRANSACTION_releaseLock, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readBoolean();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      /**
       * Returns a priority for the given use case type and the client's foreground or background
       * status.
       * 
       * @param useCase the use case type of the client. When the given use case type is invalid,
       *        the default use case type will be used. {@see TvInputService#PriorityHintUseCaseType}.
       * @param pid the pid of the client. When the pid is invalid, background status will be used as
       *        a client's status. Otherwise, client's app corresponding to the given session id will
       *        be used as a client. {@see TvInputService#onCreateSession(String, String)}.
       * 
       * @return the client priority..
       */
      @Override public int getClientPriority(int useCase, int pid) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        int _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(useCase);
          _data.writeInt(pid);
          boolean _status = mRemote.transact(Stub.TRANSACTION_getClientPriority, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readInt();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
      /**
       * Returns a config priority for the given use case type and the foreground or background
       * status.
       * 
       * @param useCase the use case type of the client. When the given use case type is invalid,
       *        the default use case type will be used. {@see TvInputService#PriorityHintUseCaseType}.
       * @param isForeground {@code true} if foreground, {@code false} otherwise.
       * 
       * @return the config priority.
       */
      @Override public int getConfigPriority(int useCase, boolean isForeground) throws android.os.RemoteException
      {
        android.os.Parcel _data = android.os.Parcel.obtain(asBinder());
        android.os.Parcel _reply = android.os.Parcel.obtain();
        int _result;
        try {
          _data.writeInterfaceToken(DESCRIPTOR);
          _data.writeInt(useCase);
          _data.writeBoolean(isForeground);
          boolean _status = mRemote.transact(Stub.TRANSACTION_getConfigPriority, _data, _reply, 0);
          _reply.readException();
          _result = _reply.readInt();
        }
        finally {
          _reply.recycle();
          _data.recycle();
        }
        return _result;
      }
    }
    static final int TRANSACTION_registerClientProfile = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
    static final int TRANSACTION_unregisterClientProfile = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
    static final int TRANSACTION_updateClientPriority = (android.os.IBinder.FIRST_CALL_TRANSACTION + 2);
    static final int TRANSACTION_hasUnusedFrontend = (android.os.IBinder.FIRST_CALL_TRANSACTION + 3);
    static final int TRANSACTION_isLowestPriority = (android.os.IBinder.FIRST_CALL_TRANSACTION + 4);
    static final int TRANSACTION_setFrontendInfoList = (android.os.IBinder.FIRST_CALL_TRANSACTION + 5);
    static final int TRANSACTION_updateCasInfo = (android.os.IBinder.FIRST_CALL_TRANSACTION + 6);
    static final int TRANSACTION_setDemuxInfoList = (android.os.IBinder.FIRST_CALL_TRANSACTION + 7);
    static final int TRANSACTION_setLnbInfoList = (android.os.IBinder.FIRST_CALL_TRANSACTION + 8);
    static final int TRANSACTION_requestFrontend = (android.os.IBinder.FIRST_CALL_TRANSACTION + 9);
    static final int TRANSACTION_setMaxNumberOfFrontends = (android.os.IBinder.FIRST_CALL_TRANSACTION + 10);
    static final int TRANSACTION_getMaxNumberOfFrontends = (android.os.IBinder.FIRST_CALL_TRANSACTION + 11);
    static final int TRANSACTION_shareFrontend = (android.os.IBinder.FIRST_CALL_TRANSACTION + 12);
    static final int TRANSACTION_transferOwner = (android.os.IBinder.FIRST_CALL_TRANSACTION + 13);
    static final int TRANSACTION_requestDemux = (android.os.IBinder.FIRST_CALL_TRANSACTION + 14);
    static final int TRANSACTION_requestDescrambler = (android.os.IBinder.FIRST_CALL_TRANSACTION + 15);
    static final int TRANSACTION_requestCasSession = (android.os.IBinder.FIRST_CALL_TRANSACTION + 16);
    static final int TRANSACTION_requestCiCam = (android.os.IBinder.FIRST_CALL_TRANSACTION + 17);
    static final int TRANSACTION_requestLnb = (android.os.IBinder.FIRST_CALL_TRANSACTION + 18);
    static final int TRANSACTION_releaseFrontend = (android.os.IBinder.FIRST_CALL_TRANSACTION + 19);
    static final int TRANSACTION_releaseDemux = (android.os.IBinder.FIRST_CALL_TRANSACTION + 20);
    static final int TRANSACTION_releaseDescrambler = (android.os.IBinder.FIRST_CALL_TRANSACTION + 21);
    static final int TRANSACTION_releaseCasSession = (android.os.IBinder.FIRST_CALL_TRANSACTION + 22);
    static final int TRANSACTION_releaseCiCam = (android.os.IBinder.FIRST_CALL_TRANSACTION + 23);
    static final int TRANSACTION_releaseLnb = (android.os.IBinder.FIRST_CALL_TRANSACTION + 24);
    static final int TRANSACTION_isHigherPriority = (android.os.IBinder.FIRST_CALL_TRANSACTION + 25);
    static final int TRANSACTION_storeResourceMap = (android.os.IBinder.FIRST_CALL_TRANSACTION + 26);
    static final int TRANSACTION_clearResourceMap = (android.os.IBinder.FIRST_CALL_TRANSACTION + 27);
    static final int TRANSACTION_restoreResourceMap = (android.os.IBinder.FIRST_CALL_TRANSACTION + 28);
    static final int TRANSACTION_acquireLock = (android.os.IBinder.FIRST_CALL_TRANSACTION + 29);
    static final int TRANSACTION_releaseLock = (android.os.IBinder.FIRST_CALL_TRANSACTION + 30);
    static final int TRANSACTION_getClientPriority = (android.os.IBinder.FIRST_CALL_TRANSACTION + 31);
    static final int TRANSACTION_getConfigPriority = (android.os.IBinder.FIRST_CALL_TRANSACTION + 32);
  }
  /** @hide */
  public static final java.lang.String DESCRIPTOR = "android.media.tv.tunerresourcemanager.ITunerResourceManager";
  /**
   * This API is used by the client to register their profile with the Tuner Resource manager.
   * 
   * <p>The profile contains information that can show the base priority score of the client.
   * 
   * @param profile {@link ResourceClientProfile} profile of the current client
   * @param listener {@link IResourcesReclaimListener} a callback to
   *                 reclaim clients' resources when needed.
   * @param clientId returns a clientId from the resource manager when the
   *                 the client registers its profile.
   */
  public void registerClientProfile(android.media.tv.tunerresourcemanager.ResourceClientProfile profile, android.media.tv.tunerresourcemanager.IResourcesReclaimListener listener, int[] clientId) throws android.os.RemoteException;
  /**
   * This API is used by the client to unregister their profile with the Tuner Resource manager.
   * 
   * @param clientId the client id that needs to be unregistered.
   */
  public void unregisterClientProfile(int clientId) throws android.os.RemoteException;
  /**
   * Updates a registered client's priority and niceValue.
   * 
   * @param clientId the id of the client that is updating its profile.
   * @param priority the priority that the client would like to update to.
   * @param niceValue the nice value that the client would like to update to.
   * 
   * @return true if the update is successful.
   */
  public boolean updateClientPriority(int clientId, int priority, int niceValue) throws android.os.RemoteException;
  /**
   * Checks if there is any unused frontend resource of the specified type.
   * 
   * @param frontendType the specific type of frontend resource to be checked for.
   * 
   * @return true if there is any unused resource of the specified type.
   */
  public boolean hasUnusedFrontend(int frontendType) throws android.os.RemoteException;
  /**
   * Checks if the client has the lowest priority among the clients that are holding
   * the frontend resource of the specified type.
   * 
   * <p> When this function returns false, it means that there is at least one client with the
   * strictly lower priority (than clientId) that is reclaimable by the system.
   * 
   * @param clientId The client ID to be checked the priority for.
   * @param frontendType The specific frontend type to be checked for.
   * 
   * @return false if there is another client holding the frontend resource of the specified type
   * that can be reclaimed. Otherwise true.
   */
  public boolean isLowestPriority(int clientId, int frontendType) throws android.os.RemoteException;
  /**
   * Updates the available Frontend resources information on the current device.
   * 
   * <p><strong>Note:</strong> This update must happen before the first
   * {@link #requestFrontend(TunerFrontendRequest,int[])} and {@link #releaseFrontend(int, int)}
   * call.
   * 
   * @param infos an array of the available {@link TunerFrontendInfo} information.
   */
  public void setFrontendInfoList(android.media.tv.tunerresourcemanager.TunerFrontendInfo[] infos) throws android.os.RemoteException;
  /**
   * Updates the available Cas resource information on the current device.
   * 
   * <p><strong>Note:</strong> This update must happen before the first
   * {@link #requestCasSession(CasSessionRequest, int[])} and {@link #releaseCasSession(int, int)}
   * call.
   * 
   * @param casSystemId id of the updating CAS system.
   * @param maxSessionNum the max session number of the CAS system that is updated.
   */
  public void updateCasInfo(int casSystemId, int maxSessionNum) throws android.os.RemoteException;
  /**
   * Updates the available Demux resources information on the current device.
   * 
   * <p><strong>Note:</strong> This update must happen before the first
   * {@link #requestDemux(TunerDemux,int[])} and {@link #releaseDemux(int, int)}
   * call.
   * 
   * @param infos an array of the available {@link TunerDemux} information.
   */
  public void setDemuxInfoList(android.media.tv.tunerresourcemanager.TunerDemuxInfo[] infos) throws android.os.RemoteException;
  /**
   * Updates the available Lnb resource information on the current device.
   * 
   * <p><strong>Note:</strong> This update must happen before the first
   * {@link #requestLnb(TunerLnbRequest, int[])} and {@link #releaseLnb(int, int)} call.
   * 
   * @param lnbIds ids of the updating lnbs.
   */
  public void setLnbInfoList(int[] lnbIds) throws android.os.RemoteException;
  /**
   * This API is used by the Tuner framework to request a frontend from the TunerHAL.
   * 
   * <p>There are two cases:
   * <ul>
   * <li>If the desiredId is not {@link TunerFrontendRequest#DEFAULT_DESIRED_ID}
   * <li><li>If the desired frontend with the given frontendType is available, the API would send
   * the id back.
   * <li><li>If the desired frontend with the given frontendType is in use but the current request
   * info can show higher priority than other uses of Frontend, the API will send
   * {@link IResourcesReclaimListener#onReclaimResources()} to the {@link Tuner}. Tuner would
   * handle the resource reclaim on the holder of lower priority and notify the holder of its
   * resource loss.
   * <li><li>If no frontend can be granted, the API would return false.
   * <ul>
   * 
   * <li>If the desiredId is {@link TunerFrontendRequest#DEFAULT_DESIRED_ID}
   * <li><li>If there is frontend available, the API would send the id back.
   * <li><li>If no Frontend is available but the current request info can show higher priority
   * than other uses of Frontend, the API will send
   * {@link IResourcesReclaimListener#onReclaimResources()} to the {@link Tuner}. Tuner would
   * handle the resource reclaim on the holder of lower priority and notify the holder of its
   * resource loss.
   * <li><li>If no frontend can be granted, the API would return false.
   * <ul>
   * 
   * <p><strong>Note:</strong> {@link #setFrontendInfoList(TunerFrontendInfo[])} must be called
   * before this request.
   * 
   * @param request {@link TunerFrontendRequest} information of the current request.
   * @param frontendHandle a one-element array to return the granted frontendHandle.
   * 
   * @return true if there is frontend granted.
   */
  public boolean requestFrontend(android.media.tv.tunerresourcemanager.TunerFrontendRequest request, int[] frontendHandle) throws android.os.RemoteException;
  /**
   * Sets the maximum usable frontends number of a given frontend type. It is used to enable or
   * disable frontends when cable connection status is changed by user.
   * 
   * @param frontendType the frontendType which the maximum usable number will be set for.
   * @param maxNumber the new maximum usable number.
   * 
   * @return true if  successful and false otherwise.
   */
  public boolean setMaxNumberOfFrontends(int frontendType, int maxNum) throws android.os.RemoteException;
  /**
   * Get the maximum usable frontends number of a given frontend type.
   * 
   * @param frontendType the frontendType which the maximum usable number will be queried for.
   * 
   * @return the maximum usable number of the queried frontend type. Returns -1 when the
   *         frontendType is invalid
   */
  public int getMaxNumberOfFrontends(int frontendType) throws android.os.RemoteException;
  /**
   * Requests to share frontend with an existing client.
   * 
   * <p><strong>Note:</strong> {@link #setFrontendInfoList(TunerFrontendInfo[])} must be called
   * before this request.
   * 
   * @param selfClientId the id of the client that sends the request.
   * @param targetClientId the id of the client to share the frontend with.
   */
  public void shareFrontend(int selfClientId, int targetClientId) throws android.os.RemoteException;
  /**
   * Transfers the ownership of the shared resource.
   * 
   * <p><strong>Note:</strong> Only the existing frontend sharee can be the new owner.
   * 
   * @param resourceType the type of resource to transfer the ownership for.
   * @param currentOwnerId the id of the current owner client.
   * @param newOwnerId the id of the new owner client.
   * 
   * @return true if successful. false otherwise.
   */
  public boolean transferOwner(int resourceType, int currentOwnerId, int newOwnerId) throws android.os.RemoteException;
  /**
   * This API is used by the Tuner framework to request an available demux from the TunerHAL.
   * 
   * <p>There are three possible scenarios:
   * <ul>
   * <li>If there is demux available, the API would send the handle back.
   * 
   * <li>If no Demux is available but the current request info can show higher priority than
   * other uses of demuxes, the API will send
   * {@link IResourcesReclaimListener#onReclaimResources()} to the {@link Tuner}. Tuner would
   * handle the resource reclaim on the holder of lower priority and notify the holder of its
   * resource loss.
   * 
   * <li>If no demux can be granted, the API would return false.
   * <ul>
   * 
   * @param request {@link TunerDemuxRequest} information of the current request.
   * @param demuxHandle a one-element array to return the granted demux handle.
   * 
   * @return true if there is demux granted.
   */
  public boolean requestDemux(android.media.tv.tunerresourcemanager.TunerDemuxRequest request, int[] demuxHandle) throws android.os.RemoteException;
  /**
   * This API is used by the Tuner framework to request an available descrambler from the
   * TunerHAL.
   * 
   * <p>There are three possible scenarios:
   * <ul>
   * <li>If there is descrambler available, the API would send the handle back.
   * 
   * <li>If no Descrambler is available but the current request info can show higher priority than
   * other uses of Descrambler, the API will send
   * {@link IResourcesReclaimListener#onReclaimResources()} to the {@link Tuner}. Tuner would
   * handle the resource reclaim on the holder of lower priority and notify the holder of its
   * resource loss.
   * 
   * <li>If no Descrambler can be granted, the API would return false.
   * <ul>
   * 
   * @param request {@link TunerDescramblerRequest} information of the current request.
   * @param descramblerHandle a one-element array to return the granted descrambler handle.
   * 
   * @return true if there is Descrambler granted.
   */
  public boolean requestDescrambler(android.media.tv.tunerresourcemanager.TunerDescramblerRequest request, int[] descramblerHandle) throws android.os.RemoteException;
  /**
   * This API is used by the Tuner framework to request an available Cas session. This session
   * needs to be under the CAS system with the id indicated in the {@code request}.
   * 
   * <p>There are three possible scenarios:
   * <ul>
   * <li>If there is Cas session available, the API would send the id back.
   * 
   * <li>If no Cas session is available but the current request info can show higher priority than
   * other uses of the sessions under the requested CAS system, the API will send
   * {@link ITunerResourceManagerCallback#onReclaimResources()} to the {@link Tuner}. Tuner would
   * handle the resource reclaim on the holder of lower priority and notify the holder of its
   * resource loss.
   * 
   * <li>If no Cas session can be granted, the API would return false.
   * <ul>
   * 
   * <p><strong>Note:</strong> {@link #updateCasInfo(int, int)} must be called before this request.
   * 
   * @param request {@link CasSessionRequest} information of the current request.
   * @param casSessionHandle a one-element array to return the granted cas session handle.
   * 
   * @return true if there is CAS session granted.
   */
  public boolean requestCasSession(android.media.tv.tunerresourcemanager.CasSessionRequest request, int[] casSessionHandle) throws android.os.RemoteException;
  /**
   * This API is used by the Tuner framework to request an available CuCam.
   * 
   * <p>There are three possible scenarios:
   * <ul>
   * <li>If there is CiCam available, the API would send the handle back.
   * 
   * <li>If no CiCma is available but the current request info can show higher priority than
   * other uses of the ciCam, the API will send
   * {@link ITunerResourceManagerCallback#onReclaimResources()} to the {@link Tuner}. Tuner would
   * handle the resource reclaim on the holder of lower priority and notify the holder of its
   * resource loss.
   * 
   * <li>If no CiCam can be granted, the API would return false.
   * <ul>
   * 
   * <p><strong>Note:</strong> {@link #updateCasInfo(int, int)} must be called before this request.
   * 
   * @param request {@link TunerCiCamRequest} information of the current request.
   * @param ciCamHandle a one-element array to return the granted ciCam handle.
   * 
   * @return true if there is CiCam granted.
   */
  public boolean requestCiCam(android.media.tv.tunerresourcemanager.TunerCiCamRequest request, int[] ciCamHandle) throws android.os.RemoteException;
  /**
   * This API is used by the Tuner framework to request an available Lnb from the TunerHAL.
   * 
   * <p>There are three possible scenarios:
   * <ul>
   * <li>If there is Lnb available, the API would send the id back.
   * 
   * <li>If no Lnb is available but the current request has a higher priority than other uses of
   * lnbs, the API will send {@link ITunerResourceManagerCallback#onReclaimResources()} to the
   * {@link Tuner}. Tuner would handle the resource reclaim on the holder of lower priority and
   * notify the holder of its resource loss.
   * 
   * <li>If no Lnb system can be granted, the API would return false.
   * <ul>
   * 
   * <p><strong>Note:</strong> {@link #setLnbInfos(int[])} must be called before this request.
   * 
   * @param request {@link TunerLnbRequest} information of the current request.
   * @param lnbHandle a one-element array to return the granted Lnb handle.
   * 
   * @return true if there is Lnb granted.
   */
  public boolean requestLnb(android.media.tv.tunerresourcemanager.TunerLnbRequest request, int[] lnbHandle) throws android.os.RemoteException;
  /**
   * Notifies the TRM that the given frontend has been released.
   * 
   * <p>Client must call this whenever it releases a Tuner frontend.
   * 
   * <p><strong>Note:</strong> {@link #setFrontendInfoList(TunerFrontendInfo[])} must be called
   * before this release.
   * 
   * @param frontendHandle the handle of the released frontend.
   * @param clientId the id of the client that is releasing the frontend.
   */
  public void releaseFrontend(int frontendHandle, int clientId) throws android.os.RemoteException;
  /**
   * Notifies the TRM that the Demux with the given handle was released.
   * 
   * <p>Client must call this whenever it releases a demux.
   * 
   * @param demuxHandle the handle of the released Tuner Demux.
   * @param clientId the id of the client that is releasing the demux.
   */
  public void releaseDemux(int demuxHandle, int clientId) throws android.os.RemoteException;
  /**
   * Notifies the TRM that the Descrambler with the given handle was released.
   * 
   * <p>Client must call this whenever it releases a descrambler.
   * 
   * @param descramblerHandle the handle of the released Tuner Descrambler.
   * @param clientId the id of the client that is releasing the descrambler.
   */
  public void releaseDescrambler(int descramblerHandle, int clientId) throws android.os.RemoteException;
  /**
   * Notifies the TRM that the given Cas session has been released.
   * 
   * <p>Client must call this whenever it releases a Cas session.
   * 
   * <p><strong>Note:</strong> {@link #updateCasInfo(int, int)} must be called before this release.
   * 
   * @param casSessionHandle the handle of the released CAS session.
   * @param clientId the id of the client that is releasing the cas session.
   */
  public void releaseCasSession(int casSessionHandle, int clientId) throws android.os.RemoteException;
  /**
   * Notifies the TRM that the given CiCam has been released.
   * 
   * <p>Client must call this whenever it releases a CiCam.
   * 
   * <p><strong>Note:</strong> {@link #updateCasInfo(int, int)} must be called before this
   * release.
   * 
   * @param ciCamHandle the handle of the releasing CiCam.
   * @param clientId the id of the client that is releasing the CiCam.
   */
  public void releaseCiCam(int ciCamHandle, int clientId) throws android.os.RemoteException;
  /**
   * Notifies the TRM that the Lnb with the given handle was released.
   * 
   * <p>Client must call this whenever it releases an Lnb.
   * 
   * <p><strong>Note:</strong> {@link #setLnbInfos(int[])} must be called before this release.
   * 
   * @param lnbHandle the handle of the released Tuner Lnb.
   * @param clientId the id of the client that is releasing the lnb.
   */
  public void releaseLnb(int lnbHandle, int clientId) throws android.os.RemoteException;
  /**
   * Compare two clients' priority.
   * 
   * @param challengerProfile the {@link ResourceClientProfile} of the challenger.
   * @param holderProfile the {@link ResourceClientProfile} of the holder of the resource.
   * 
   * @return true if the challenger has higher priority than the holder.
   */
  public boolean isHigherPriority(android.media.tv.tunerresourcemanager.ResourceClientProfile challengerProfile, android.media.tv.tunerresourcemanager.ResourceClientProfile holderProfile) throws android.os.RemoteException;
  /**
   * Stores Frontend resource map for the later restore.
   * 
   * <p>This is API is only for testing purpose and should be used in pair with
   * restoreResourceMap(), which allows testing of {@link Tuner} APIs
   * that behave differently based on different sets of resource map.
   * 
   * @param resourceType The resource type to store the map for.
   */
  public void storeResourceMap(int resourceType) throws android.os.RemoteException;
  /**
   * Clears the frontend resource map.
   * 
   * <p>This is API is only for testing purpose and should be called right after
   * storeResourceMap(), so TRMService#removeFrontendResource() does not
   * get called in TRMService#setFrontendInfoListInternal() for custom frontend
   * resource map creation.
   * 
   * @param resourceType The resource type to clear the map for.
   */
  public void clearResourceMap(int resourceType) throws android.os.RemoteException;
  /**
   * Restores Frontend resource map if it was stored before.
   * 
   * <p>This is API is only for testing purpose and should be used in pair with
   * storeResourceMap(), which allows testing of {@link Tuner} APIs
   * that behave differently based on different sets of resource map.
   * 
   * @param resourceType The resource type to restore the map for.
   */
  public void restoreResourceMap(int resourceType) throws android.os.RemoteException;
  /**
   * Grants the lock to the caller for public {@link Tuner} APIs
   * 
   * <p>{@link Tuner} functions that call both [@link TunerResourceManager} APIs and
   * grabs lock that are also used in {@link IResourcesReclaimListener#onReclaimResources()}
   * must call this API before acquiring lock used in onReclaimResources().
   * 
   * <p>This API will block until it releases the lock or fails
   * 
   * @param clientId The ID of the caller.
   * 
   * @return true if the lock is granted. If false is returned, calling this API again is not
   * guaranteed to work and may be unrecoverrable. (This should not happen.)
   */
  public boolean acquireLock(int clientId, long clientThreadId) throws android.os.RemoteException;
  /**
   * Releases the lock to the caller for public {@link Tuner} APIs
   * 
   * <p>This API must be called in pair with {@link #acquireLock(int, int)}
   * 
   * <p>This API will block until it releases the lock or fails
   * 
   * @param clientId The ID of the caller.
   * 
   * @return true if the lock is granted. If false is returned, calling this API again is not
   * guaranteed to work and may be unrecoverrable. (This should not happen.)
   */
  public boolean releaseLock(int clientId) throws android.os.RemoteException;
  /**
   * Returns a priority for the given use case type and the client's foreground or background
   * status.
   * 
   * @param useCase the use case type of the client. When the given use case type is invalid,
   *        the default use case type will be used. {@see TvInputService#PriorityHintUseCaseType}.
   * @param pid the pid of the client. When the pid is invalid, background status will be used as
   *        a client's status. Otherwise, client's app corresponding to the given session id will
   *        be used as a client. {@see TvInputService#onCreateSession(String, String)}.
   * 
   * @return the client priority..
   */
  public int getClientPriority(int useCase, int pid) throws android.os.RemoteException;
  /**
   * Returns a config priority for the given use case type and the foreground or background
   * status.
   * 
   * @param useCase the use case type of the client. When the given use case type is invalid,
   *        the default use case type will be used. {@see TvInputService#PriorityHintUseCaseType}.
   * @param isForeground {@code true} if foreground, {@code false} otherwise.
   * 
   * @return the config priority.
   */
  public int getConfigPriority(int useCase, boolean isForeground) throws android.os.RemoteException;
}
