Loading services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java +1 −1 Original line number Diff line number Diff line Loading @@ -131,7 +131,7 @@ public final class ClientProfile { mUsingFrontendIds.add(frontendId); } public Iterable<Integer> getInUseFrontendIds() { public Set<Integer> getInUseFrontendIds() { return mUsingFrontendIds; } Loading services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java +33 −10 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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); } } Loading Loading @@ -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()); Loading Loading @@ -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); Loading services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java +60 −17 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); } Loading Loading @@ -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); } Loading Loading @@ -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 Loading Loading @@ -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); Loading @@ -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()) Loading Loading @@ -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); Loading @@ -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()) Loading @@ -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 Loading Loading @@ -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()) Loading Loading @@ -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 Loading @@ -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); } } Loading
services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java +1 −1 Original line number Diff line number Diff line Loading @@ -131,7 +131,7 @@ public final class ClientProfile { mUsingFrontendIds.add(frontendId); } public Iterable<Integer> getInUseFrontendIds() { public Set<Integer> getInUseFrontendIds() { return mUsingFrontendIds; } Loading
services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java +33 −10 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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); } } Loading Loading @@ -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()); Loading Loading @@ -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); Loading
services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java +60 −17 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); } Loading Loading @@ -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); } Loading Loading @@ -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 Loading Loading @@ -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); Loading @@ -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()) Loading Loading @@ -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); Loading @@ -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()) Loading @@ -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 Loading Loading @@ -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()) Loading Loading @@ -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 Loading @@ -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); } }