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

Commit d0e0a688 authored by Automerger Merge Worker's avatar Automerger Merge Worker
Browse files

Merge changes from topic "handle_per" into rvc-dev am: 78688bc4

Change-Id: Id40d62d5469ca9f93a9c3db310a192729a40ce7d
parents 7efce04d 78688bc4
Loading
Loading
Loading
Loading
+0 −5
Original line number Diff line number Diff line
@@ -60,11 +60,6 @@ public class TunerResourceManager {
    private static final String TAG = "TunerResourceManager";
    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);

    public static final int INVALID_FRONTEND_ID = -1;
    public static final int INVALID_CAS_SESSION_RESOURCE_ID = -1;
    public static final int INVALID_LNB_ID = -1;
    public static final int INVALID_TV_INPUT_DEVICE_ID = -1;
    public static final int INVALID_TV_INPUT_PORT_ID = -1;
    public static final int INVALID_RESOURCE_HANDLE = -1;

    private final ITunerResourceManager mService;
+86 −20
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.server.tv.tunerresourcemanager;

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
@@ -40,6 +41,8 @@ import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.SystemService;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -70,9 +73,31 @@ public class TunerResourceManagerService extends SystemService {
    private TvInputManager mManager;
    private UseCasePriorityHints mPriorityCongfig = new UseCasePriorityHints();

    // An internal resource request count to help generate resource handle.
    private int mResourceRequestCount = 0;

    // Used to synchronize the access to the service.
    private final Object mLock = new Object();

    /**
     * Tuner resource type to help generate resource handle
     */
    @IntDef({
        TUNER_RESOURCE_TYPE_FRONTEND,
        TUNER_RESOURCE_TYPE_DEMUX,
        TUNER_RESOURCE_TYPE_DESCRAMBLER,
        TUNER_RESOURCE_TYPE_LNB,
        TUNER_RESOURCE_TYPE_CAS_SESSION,
     })
    @Retention(RetentionPolicy.SOURCE)
    public @interface TunerResourceType {}

    public static final int TUNER_RESOURCE_TYPE_FRONTEND = 0;
    public static final int TUNER_RESOURCE_TYPE_DEMUX = 1;
    public static final int TUNER_RESOURCE_TYPE_DESCRAMBLER = 2;
    public static final int TUNER_RESOURCE_TYPE_LNB = 3;
    public static final int TUNER_RESOURCE_TYPE_CAS_SESSION = 4;

    public TunerResourceManagerService(@Nullable Context context) {
        super(context);
    }
@@ -96,7 +121,7 @@ public class TunerResourceManagerService extends SystemService {
        public void registerClientProfile(@NonNull ResourceClientProfile profile,
                @NonNull IResourcesReclaimListener listener, @NonNull int[] clientId)
                throws RemoteException {
            enforceAccessPermission();
            enforceTrmAccessPermission("registerClientProfile");
            if (profile == null) {
                throw new RemoteException("ResourceClientProfile can't be null");
            }
@@ -120,7 +145,7 @@ public class TunerResourceManagerService extends SystemService {

        @Override
        public void unregisterClientProfile(int clientId) throws RemoteException {
            enforceAccessPermission();
            enforceTrmAccessPermission("unregisterClientProfile");
            synchronized (mLock) {
                if (!checkClientExists(clientId)) {
                    Slog.e(TAG, "Unregistering non exists client:" + clientId);
@@ -132,7 +157,7 @@ public class TunerResourceManagerService extends SystemService {

        @Override
        public boolean updateClientPriority(int clientId, int priority, int niceValue) {
            enforceAccessPermission();
            enforceTrmAccessPermission("updateClientPriority");
            synchronized (mLock) {
                return updateClientPriorityInternal(clientId, priority, niceValue);
            }
@@ -140,7 +165,7 @@ public class TunerResourceManagerService extends SystemService {

        @Override
        public void setFrontendInfoList(@NonNull TunerFrontendInfo[] infos) throws RemoteException {
            enforceAccessPermission();
            enforceTrmAccessPermission("setFrontendInfoList");
            if (infos == null) {
                throw new RemoteException("TunerFrontendInfo can't be null");
            }
@@ -151,6 +176,7 @@ public class TunerResourceManagerService extends SystemService {

        @Override
        public void updateCasInfo(int casSystemId, int maxSessionNum) {
            enforceTrmAccessPermission("updateCasInfo");
            if (DEBUG) {
                Slog.d(TAG,
                        "updateCasInfo(casSystemId=" + casSystemId
@@ -160,6 +186,7 @@ public class TunerResourceManagerService extends SystemService {

        @Override
        public void setLnbInfoList(int[] lnbIds) {
            enforceTrmAccessPermission("setLnbInfoList");
            if (DEBUG) {
                for (int i = 0; i < lnbIds.length; i++) {
                    Slog.d(TAG, "updateLnbInfo(lnbId=" + lnbIds[i] + ")");
@@ -169,14 +196,15 @@ public class TunerResourceManagerService extends SystemService {

        @Override
        public boolean requestFrontend(@NonNull TunerFrontendRequest request,
                @NonNull int[] frontendId) throws RemoteException {
            enforceAccessPermission();
            if (frontendId == null) {
                @NonNull int[] frontendHandle) throws RemoteException {
            enforceTunerAccessPermission("requestFrontend");
            enforceTrmAccessPermission("requestFrontend");
            if (frontendHandle == null) {
                throw new RemoteException("frontendId can't be null");
            }
            synchronized (mLock) {
                try {
                    return requestFrontendInternal(request, frontendId);
                    return requestFrontendInternal(request, frontendHandle);
                } catch (RemoteException e) {
                    throw e.rethrowFromSystemServer();
                }
@@ -185,6 +213,8 @@ public class TunerResourceManagerService extends SystemService {

        @Override
        public void shareFrontend(int selfClientId, int targetClientId) {
            enforceTunerAccessPermission("shareFrontend");
            enforceTrmAccessPermission("shareFrontend");
            if (DEBUG) {
                Slog.d(TAG, "shareFrontend from " + selfClientId + " with " + targetClientId);
            }
@@ -193,6 +223,8 @@ public class TunerResourceManagerService extends SystemService {
        @Override
        public boolean requestDemux(@NonNull TunerDemuxRequest request,
                    @NonNull int[] demuxHandle) {
            enforceTunerAccessPermission("requestDemux");
            enforceTrmAccessPermission("requestDemux");
            if (DEBUG) {
                Slog.d(TAG, "requestDemux(request=" + request + ")");
            }
@@ -202,6 +234,8 @@ public class TunerResourceManagerService extends SystemService {
        @Override
        public boolean requestDescrambler(@NonNull TunerDescramblerRequest request,
                    @NonNull int[] descrambleHandle) {
            enforceDescramblerAccessPermission("requestDescrambler");
            enforceTrmAccessPermission("requestDescrambler");
            if (DEBUG) {
                Slog.d(TAG, "requestDescrambler(request=" + request + ")");
            }
@@ -210,7 +244,8 @@ public class TunerResourceManagerService extends SystemService {

        @Override
        public boolean requestCasSession(
                @NonNull CasSessionRequest request, @NonNull int[] sessionResourceId) {
                @NonNull CasSessionRequest request, @NonNull int[] sessionResourceHandle) {
            enforceTrmAccessPermission("requestCasSession");
            if (DEBUG) {
                Slog.d(TAG, "requestCasSession(request=" + request + ")");
            }
@@ -219,7 +254,9 @@ public class TunerResourceManagerService extends SystemService {
        }

        @Override
        public boolean requestLnb(@NonNull TunerLnbRequest request, @NonNull int[] lnbId) {
        public boolean requestLnb(@NonNull TunerLnbRequest request, @NonNull int[] lnbHandle) {
            enforceTunerAccessPermission("requestLnb");
            enforceTrmAccessPermission("requestLnb");
            if (DEBUG) {
                Slog.d(TAG, "requestLnb(request=" + request + ")");
            }
@@ -228,6 +265,8 @@ public class TunerResourceManagerService extends SystemService {

        @Override
        public void releaseFrontend(int frontendId) {
            enforceTunerAccessPermission("releaseFrontend");
            enforceTrmAccessPermission("releaseFrontend");
            if (DEBUG) {
                Slog.d(TAG, "releaseFrontend(id=" + frontendId + ")");
            }
@@ -235,6 +274,8 @@ public class TunerResourceManagerService extends SystemService {

        @Override
        public void releaseDemux(int demuxHandle) {
            enforceTunerAccessPermission("releaseDemux");
            enforceTrmAccessPermission("releaseDemux");
            if (DEBUG) {
                Slog.d(TAG, "releaseDemux(demuxHandle=" + demuxHandle + ")");
            }
@@ -242,6 +283,8 @@ public class TunerResourceManagerService extends SystemService {

        @Override
        public void releaseDescrambler(int descramblerHandle) {
            enforceTunerAccessPermission("releaseDescrambler");
            enforceTrmAccessPermission("releaseDescrambler");
            if (DEBUG) {
                Slog.d(TAG, "releaseDescrambler(descramblerHandle=" + descramblerHandle + ")");
            }
@@ -249,6 +292,7 @@ public class TunerResourceManagerService extends SystemService {

        @Override
        public void releaseCasSession(int sessionResourceId) {
            enforceTrmAccessPermission("releaseCasSession");
            if (DEBUG) {
                Slog.d(TAG, "releaseCasSession(sessionResourceId=" + sessionResourceId + ")");
            }
@@ -256,6 +300,8 @@ public class TunerResourceManagerService extends SystemService {

        @Override
        public void releaseLnb(int lnbId) {
            enforceTunerAccessPermission("releaseLnb");
            enforceTrmAccessPermission("releaseLnb");
            if (DEBUG) {
                Slog.d(TAG, "releaseLnb(lnbId=" + lnbId + ")");
            }
@@ -264,6 +310,7 @@ public class TunerResourceManagerService extends SystemService {
        @Override
        public boolean isHigherPriority(
                ResourceClientProfile challengerProfile, ResourceClientProfile holderProfile) {
            enforceTrmAccessPermission("isHigherPriority");
            if (DEBUG) {
                Slog.d(TAG,
                        "isHigherPriority(challengerProfile=" + challengerProfile
@@ -371,13 +418,13 @@ public class TunerResourceManagerService extends SystemService {
    }

    @VisibleForTesting
    protected boolean requestFrontendInternal(TunerFrontendRequest request, int[] frontendId)
    protected boolean requestFrontendInternal(TunerFrontendRequest request, int[] frontendHandle)
            throws RemoteException {
        if (DEBUG) {
            Slog.d(TAG, "requestFrontend(request=" + request + ")");
        }

        frontendId[0] = TunerResourceManager.INVALID_FRONTEND_ID;
        frontendHandle[0] = TunerResourceManager.INVALID_RESOURCE_HANDLE;
        if (!checkClientExists(request.getClientId())) {
            Slog.e(TAG, "Request frontend from unregistered client:" + request.getClientId());
            return false;
@@ -413,17 +460,20 @@ public class TunerResourceManagerService extends SystemService {

        // Grant frontend when there is unused resource.
        if (grantingFrontendId > -1) {
            frontendId[0] = grantingFrontendId;
            updateFrontendClientMappingOnNewGrant(frontendId[0], request.getClientId());
            frontendHandle[0] = generateResourceHandle(
                    TUNER_RESOURCE_TYPE_FRONTEND, grantingFrontendId);
            updateFrontendClientMappingOnNewGrant(grantingFrontendId, request.getClientId());
            return true;
        }

        // When all the resources are occupied, grant the lowest priority resource if the
        // request client has higher priority.
        if (inUseLowestPriorityFrId > -1 && (requestClient.getPriority() > currentLowestPriority)) {
            frontendId[0] = inUseLowestPriorityFrId;
            reclaimFrontendResource(getFrontendResource(frontendId[0]).getOwnerClientId());
            updateFrontendClientMappingOnNewGrant(frontendId[0], request.getClientId());
            frontendHandle[0] = generateResourceHandle(
                    TUNER_RESOURCE_TYPE_FRONTEND, inUseLowestPriorityFrId);
            reclaimFrontendResource(getFrontendResource(
                    inUseLowestPriorityFrId).getOwnerClientId());
            updateFrontendClientMappingOnNewGrant(inUseLowestPriorityFrId, request.getClientId());
            return true;
        }

@@ -592,8 +642,24 @@ public class TunerResourceManagerService extends SystemService {
        return mClientProfiles.keySet().contains(clientId);
    }

    private void enforceAccessPermission() {
        getContext().enforceCallingOrSelfPermission(
                "android.permission.TUNER_RESOURCE_ACCESS", TAG);
    private int generateResourceHandle(@TunerResourceType int resourceType, int resourceId) {
        return (resourceType & 0x000000ff) << 24
                | (resourceId << 16)
                | (mResourceRequestCount++ & 0xffff);
    }

    private void enforceTrmAccessPermission(String apiName) {
        getContext().enforceCallingPermission("android.permission.TUNER_RESOURCE_ACCESS",
                TAG + ": " + "apiName");
    }

    private void enforceTunerAccessPermission(String apiName) {
        getContext().enforceCallingPermission("android.Manifest.permission.ACCESS_TV_TUNER",
                TAG + ": " + "apiName");
    }

    private void enforceDescramblerAccessPermission(String apiName) {
        getContext().enforceCallingPermission("android.Manifest.permission.ACCESS_TV_DESCRAMBLER",
                TAG + ": " + "apiName");
    }
}
+46 −37
Original line number Diff line number Diff line
@@ -92,6 +92,13 @@ public class TunerResourceManagerServiceTest {
            }
        };

    private static int getResourceIdFromHandle(int resourceHandle) {
        if (resourceHandle == TunerResourceManager.INVALID_RESOURCE_HANDLE) {
            return resourceHandle;
        }
        return (resourceHandle & 0x00ff0000) >> 16;
    }

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
@@ -229,14 +236,15 @@ public class TunerResourceManagerServiceTest {
    public void requestFrontendTest_ClientNotRegistered() {
        TunerFrontendRequest request =
                new TunerFrontendRequest(0 /*clientId*/, FrontendSettings.TYPE_DVBT);
        int[] frontendId = new int[1];
        int[] frontendHandle = new int[1];
        try {
            assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId))
                    .isFalse();
            assertThat(mTunerResourceManagerService
                    .requestFrontendInternal(request, frontendHandle)).isFalse();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        assertThat(frontendId[0]).isEqualTo(TunerResourceManager.INVALID_FRONTEND_ID);
        assertThat(getResourceIdFromHandle(frontendHandle[0]))
                .isEqualTo(TunerResourceManager.INVALID_RESOURCE_HANDLE);
    }

    @Test
@@ -256,14 +264,15 @@ public class TunerResourceManagerServiceTest {

        TunerFrontendRequest request =
                new TunerFrontendRequest(clientId[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
        int[] frontendId = new int[1];
        int[] frontendHandle = new int[1];
        try {
            assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId))
                    .isFalse();
            assertThat(mTunerResourceManagerService
                    .requestFrontendInternal(request, frontendHandle)).isFalse();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        assertThat(frontendId[0]).isEqualTo(TunerResourceManager.INVALID_FRONTEND_ID);
        assertThat(getResourceIdFromHandle(frontendHandle[0]))
                .isEqualTo(TunerResourceManager.INVALID_RESOURCE_HANDLE);
    }

    @Test
@@ -287,14 +296,14 @@ public class TunerResourceManagerServiceTest {

        TunerFrontendRequest request =
                new TunerFrontendRequest(clientId[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
        int[] frontendId = new int[1];
        int[] frontendHandle = new int[1];
        try {
            assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId))
                    .isTrue();
            assertThat(mTunerResourceManagerService
                    .requestFrontendInternal(request, frontendHandle)).isTrue();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        assertThat(frontendId[0]).isEqualTo(0);
        assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(0);
    }

    @Test
@@ -322,26 +331,26 @@ public class TunerResourceManagerServiceTest {
                new TunerFrontendInfo(2 /*id*/, FrontendSettings.TYPE_DVBS, 1 /*exclusiveGroupId*/);
        mTunerResourceManagerService.setFrontendInfoListInternal(infos);

        int[] frontendId = new int[1];
        int[] frontendHandle = new int[1];
        TunerFrontendRequest request =
                new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
        try {
            assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId))
                    .isTrue();
            assertThat(mTunerResourceManagerService
                    .requestFrontendInternal(request, frontendHandle)).isTrue();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        assertThat(frontendId[0]).isEqualTo(infos[0].getId());
        assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[0].getId());

        request =
                new TunerFrontendRequest(clientId0[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
        try {
            assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId))
                    .isTrue();
            assertThat(mTunerResourceManagerService
                    .requestFrontendInternal(request, frontendHandle)).isTrue();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        assertThat(frontendId[0]).isEqualTo(infos[1].getId());
        assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[1].getId());
        assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
                .isInUse()).isTrue();
        assertThat(mTunerResourceManagerService.getFrontendResource(infos[2].getId())
@@ -382,10 +391,10 @@ public class TunerResourceManagerServiceTest {

        TunerFrontendRequest request =
                new TunerFrontendRequest(clientId0[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
        int[] frontendId = new int[1];
        int[] frontendHandle = new int[1];
        try {
            assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId))
                    .isTrue();
            assertThat(mTunerResourceManagerService
                    .requestFrontendInternal(request, frontendHandle)).isTrue();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
@@ -393,8 +402,8 @@ public class TunerResourceManagerServiceTest {
        request =
                new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
        try {
            assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId))
                    .isFalse();
            assertThat(mTunerResourceManagerService
                    .requestFrontendInternal(request, frontendHandle)).isFalse();
            assertThat(listener.isRelaimed()).isFalse();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
@@ -403,8 +412,8 @@ public class TunerResourceManagerServiceTest {
        request =
                new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBS);
        try {
            assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId))
                    .isFalse();
            assertThat(mTunerResourceManagerService
                    .requestFrontendInternal(request, frontendHandle)).isFalse();
            assertThat(listener.isRelaimed()).isFalse();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
@@ -444,24 +453,24 @@ public class TunerResourceManagerServiceTest {

        TunerFrontendRequest request =
                new TunerFrontendRequest(clientId0[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
        int[] frontendId = new int[1];
        int[] frontendHandle = new int[1];
        try {
            assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId))
                    .isTrue();
            assertThat(mTunerResourceManagerService
                    .requestFrontendInternal(request, frontendHandle)).isTrue();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        assertThat(frontendId[0]).isEqualTo(infos[0].getId());
        assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[0].getId());

        request =
                new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBS);
        try {
            assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId))
                    .isTrue();
            assertThat(mTunerResourceManagerService
                    .requestFrontendInternal(request, frontendHandle)).isTrue();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        assertThat(frontendId[0]).isEqualTo(infos[1].getId());
        assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[1].getId());
        assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId())
                .isInUse()).isTrue();
        assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
@@ -493,14 +502,14 @@ public class TunerResourceManagerServiceTest {

        TunerFrontendRequest request =
                new TunerFrontendRequest(clientId[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
        int[] frontendId = new int[1];
        int[] frontendHandle = new int[1];
        try {
            assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId))
                    .isTrue();
            assertThat(mTunerResourceManagerService
                    .requestFrontendInternal(request, frontendHandle)).isTrue();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        assertThat(frontendId[0]).isEqualTo(infos[0].getId());
        assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[0].getId());
        assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId())
                .isInUse()).isTrue();
        assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())