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

Commit ee5f63cc authored by Amy Zhang's avatar Amy Zhang
Browse files

Complete Frontend release implementation in TRM

Test: atest
Bug: 150952662
Change-Id: Iff876d2f2762724c3ad30d213e75cd364ea5ee87
parent 2f9cab38
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -131,7 +131,7 @@ public final class ClientProfile {
        mUsingFrontendIds.add(frontendId);
    }

    public Iterable<Integer> getInUseFrontendIds() {
    public Set<Integer> getInUseFrontendIds() {
        return mUsingFrontendIds;
    }

+33 −10
Original line number Diff line number Diff line
@@ -243,19 +243,21 @@ public class TunerResourceManagerService extends SystemService {
            if (DEBUG) {
                Slog.d(TAG, "requestLnb(request=" + request + ")");
            }

            return true;
        }

        @Override
        public void releaseFrontend(int frontendHandle) {
        public void releaseFrontend(int frontendHandle) throws RemoteException {
            enforceTunerAccessPermission("releaseFrontend");
            enforceTrmAccessPermission("releaseFrontend");
            int frontendId = getResourceId(
                    TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND, frontendHandle);
            if (DEBUG) {
                Slog.d(TAG, "releaseFrontend(id=" + frontendId + ")");
            if (!validateResourceHandle(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND,
                    frontendHandle)) {
                throw new RemoteException("frontendHandle can't be invalid");
            }
            synchronized (mLock) {
                releaseFrontendInternal(getResourceIdFromHandle(frontendHandle));
            }
            updateFrontendClientMappingOnRelease(frontendId);
        }

        @Override
@@ -396,7 +398,6 @@ public class TunerResourceManagerService extends SystemService {
            }
        }

        // TODO check if the removing resource is in use or not. Handle the conflict.
        for (int removingId : updatingFrontendIds) {
            // update the exclusive group id member list
            removeFrontendResource(removingId);
@@ -466,6 +467,14 @@ public class TunerResourceManagerService extends SystemService {
        return false;
    }

    @VisibleForTesting
    void releaseFrontendInternal(int frontendId) {
        if (DEBUG) {
            Slog.d(TAG, "releaseFrontend(id=" + frontendId + ")");
        }
        updateFrontendClientMappingOnRelease(frontendId);
    }

    @VisibleForTesting
    boolean requestDemuxInternal(TunerDemuxRequest request, int[] demuxHandle) {
        if (DEBUG) {
@@ -578,7 +587,7 @@ public class TunerResourceManagerService extends SystemService {
        ownerProfile.releaseFrontend(frontendId);
        for (int exclusiveGroupMember : releasingFrontend.getExclusiveGroupMemberFeIds()) {
            getFrontendResource(exclusiveGroupMember).removeOwner();
            ownerProfile.releaseFrontend(frontendId);
            ownerProfile.releaseFrontend(exclusiveGroupMember);
        }
    }

@@ -623,6 +632,9 @@ public class TunerResourceManagerService extends SystemService {

    private void removeFrontendResource(int removingId) {
        FrontendResource fe = getFrontendResource(removingId);
        if (fe.isInUse()) {
            releaseFrontendInternal(removingId);
        }
        for (int excGroupmemberFeId : fe.getExclusiveGroupMemberFeIds()) {
            getFrontendResource(excGroupmemberFeId)
                    .removeExclusiveGroupMemberFeId(fe.getId());
@@ -665,11 +677,22 @@ public class TunerResourceManagerService extends SystemService {
                | (mResourceRequestCount++ & 0xffff);
    }

    private int getResourceId(
            @TunerResourceManager.TunerResourceType int resourceType, int resourceHandle) {
    @VisibleForTesting
    protected int getResourceIdFromHandle(int resourceHandle) {
        if (resourceHandle == TunerResourceManager.INVALID_RESOURCE_HANDLE) {
            return resourceHandle;
        }
        return (resourceHandle & 0x00ff0000) >> 16;
    }

    private boolean validateResourceHandle(int resourceType, int resourceHandle) {
        if (resourceHandle == TunerResourceManager.INVALID_RESOURCE_HANDLE
                || ((resourceHandle & 0xff000000) >> 24) != resourceType) {
            return false;
        }
        return true;
    }

    private void enforceTrmAccessPermission(String apiName) {
        getContext().enforceCallingPermission("android.permission.TUNER_RESOURCE_ACCESS",
                TAG + ": " + apiName);
+60 −17
Original line number Diff line number Diff line
@@ -96,13 +96,6 @@ 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);
@@ -247,7 +240,7 @@ public class TunerResourceManagerServiceTest {
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        assertThat(getResourceIdFromHandle(frontendHandle[0]))
        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
                .isEqualTo(TunerResourceManager.INVALID_RESOURCE_HANDLE);
    }

@@ -275,7 +268,7 @@ public class TunerResourceManagerServiceTest {
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        assertThat(getResourceIdFromHandle(frontendHandle[0]))
        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
                .isEqualTo(TunerResourceManager.INVALID_RESOURCE_HANDLE);
    }

@@ -307,7 +300,8 @@ public class TunerResourceManagerServiceTest {
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(0);
        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
                .isEqualTo(0);
    }

    @Test
@@ -344,7 +338,8 @@ public class TunerResourceManagerServiceTest {
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[0].getId());
        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
                .isEqualTo(infos[0].getId());

        request =
                new TunerFrontendRequest(clientId0[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
@@ -354,7 +349,8 @@ public class TunerResourceManagerServiceTest {
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[1].getId());
        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
                .isEqualTo(infos[1].getId());
        assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
                .isInUse()).isTrue();
        assertThat(mTunerResourceManagerService.getFrontendResource(infos[2].getId())
@@ -464,7 +460,8 @@ public class TunerResourceManagerServiceTest {
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[0].getId());
        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
                .isEqualTo(infos[0].getId());

        request =
                new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBS);
@@ -474,7 +471,8 @@ public class TunerResourceManagerServiceTest {
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[1].getId());
        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
                .isEqualTo(infos[1].getId());
        assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId())
                .isInUse()).isTrue();
        assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
@@ -486,6 +484,49 @@ public class TunerResourceManagerServiceTest {
        assertThat(listener.isRelaimed()).isTrue();
    }

    @Test
    public void releaseFrontendTest_UnderTheSameExclusiveGroup() {
        // Register clients
        ResourceClientProfile[] profiles = new ResourceClientProfile[1];
        profiles[0] = new ResourceClientProfile("0" /*sessionId*/,
                TvInputService.PRIORITY_HINT_USE_CASE_TYPE_PLAYBACK);
        int[] clientId = new int[1];
        TestResourcesReclaimListener listener = new TestResourcesReclaimListener();
        mTunerResourceManagerService.registerClientProfileInternal(profiles[0], listener, clientId);
        assertThat(clientId[0]).isNotEqualTo(TunerResourceManagerService.INVALID_CLIENT_ID);

        // Init frontend resources.
        TunerFrontendInfo[] infos = new TunerFrontendInfo[2];
        infos[0] =
                new TunerFrontendInfo(0 /*id*/, FrontendSettings.TYPE_DVBT, 1 /*exclusiveGroupId*/);
        infos[1] =
                new TunerFrontendInfo(1 /*id*/, FrontendSettings.TYPE_DVBS, 1 /*exclusiveGroupId*/);
        mTunerResourceManagerService.setFrontendInfoListInternal(infos);

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

        // Release frontend
        mTunerResourceManagerService.releaseFrontendInternal(frontendId);
        assertThat(mTunerResourceManagerService
                .getFrontendResource(frontendId).isInUse()).isFalse();
        assertThat(mTunerResourceManagerService
                .getFrontendResource(infos[1].getId()).isInUse()).isFalse();
        assertThat(mTunerResourceManagerService
                .getClientProfile(clientId[0]).getInUseFrontendIds().size()).isEqualTo(0);
    }

    @Test
    public void unregisterClientTest_usingFrontend() {
        // Register client
@@ -513,7 +554,8 @@ public class TunerResourceManagerServiceTest {
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
        assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[0].getId());
        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
                .isEqualTo(infos[0].getId());
        assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId())
                .isInUse()).isTrue();
        assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
@@ -543,7 +585,8 @@ public class TunerResourceManagerServiceTest {
        TunerDemuxRequest request = new TunerDemuxRequest(clientId[0]);
        assertThat(mTunerResourceManagerService.requestDemuxInternal(request, demuxHandle))
                .isTrue();
        assertThat(getResourceIdFromHandle(demuxHandle[0])).isEqualTo(0);
        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(demuxHandle[0]))
                .isEqualTo(0);
    }

    @Test
@@ -560,6 +603,6 @@ public class TunerResourceManagerServiceTest {
        TunerDescramblerRequest request = new TunerDescramblerRequest(clientId[0]);
        assertThat(mTunerResourceManagerService.requestDescramblerInternal(request, desHandle))
                .isTrue();
        assertThat(getResourceIdFromHandle(desHandle[0])).isEqualTo(0);
        assertThat(mTunerResourceManagerService.getResourceIdFromHandle(desHandle[0])).isEqualTo(0);
    }
}