diff options
3 files changed, 94 insertions, 28 deletions
diff --git a/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java b/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java index e100ff816f00..dfd23df40374 100644 --- a/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java +++ b/services/core/java/com/android/server/tv/tunerresourcemanager/ClientProfile.java @@ -131,7 +131,7 @@ public final class ClientProfile { mUsingFrontendIds.add(frontendId); } - public Iterable<Integer> getInUseFrontendIds() { + public Set<Integer> getInUseFrontendIds() { return mUsingFrontendIds; } diff --git a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java index 921bd1d9f845..fd2445f8366e 100644 --- a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java +++ b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java @@ -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); @@ -467,6 +468,14 @@ public class TunerResourceManagerService extends SystemService { } @VisibleForTesting + void releaseFrontendInternal(int frontendId) { + if (DEBUG) { + Slog.d(TAG, "releaseFrontend(id=" + frontendId + ")"); + } + updateFrontendClientMappingOnRelease(frontendId); + } + + @VisibleForTesting boolean requestDemuxInternal(TunerDemuxRequest request, int[] demuxHandle) { if (DEBUG) { Slog.d(TAG, "requestDemux(request=" + request + ")"); @@ -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); diff --git a/services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java index fcbd5072ae35..13248a00c1b0 100644 --- a/services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java @@ -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()) @@ -487,6 +485,49 @@ public class TunerResourceManagerServiceTest { } @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 ResourceClientProfile profile = new ResourceClientProfile("0" /*sessionId*/, @@ -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); } } |