Merge changes from topic "tuner_cts_scanning" into rvc-dev am: 13646bb12e

Change-Id: Ia82ac7364009fa998e970cca76351334f5be1a2e
This commit is contained in:
TreeHugger Robot
2020-04-16 23:32:04 +00:00
committed by Automerger Merge Worker
3 changed files with 94 additions and 28 deletions

View File

@@ -131,7 +131,7 @@ public final class ClientProfile {
mUsingFrontendIds.add(frontendId); mUsingFrontendIds.add(frontendId);
} }
public Iterable<Integer> getInUseFrontendIds() { public Set<Integer> getInUseFrontendIds() {
return mUsingFrontendIds; return mUsingFrontendIds;
} }

View File

@@ -243,19 +243,21 @@ public class TunerResourceManagerService extends SystemService {
if (DEBUG) { if (DEBUG) {
Slog.d(TAG, "requestLnb(request=" + request + ")"); Slog.d(TAG, "requestLnb(request=" + request + ")");
} }
return true; return true;
} }
@Override @Override
public void releaseFrontend(int frontendHandle) { public void releaseFrontend(int frontendHandle) throws RemoteException {
enforceTunerAccessPermission("releaseFrontend"); enforceTunerAccessPermission("releaseFrontend");
enforceTrmAccessPermission("releaseFrontend"); enforceTrmAccessPermission("releaseFrontend");
int frontendId = getResourceId( if (!validateResourceHandle(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND,
TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND, frontendHandle); frontendHandle)) {
if (DEBUG) { throw new RemoteException("frontendHandle can't be invalid");
Slog.d(TAG, "releaseFrontend(id=" + frontendId + ")"); }
synchronized (mLock) {
releaseFrontendInternal(getResourceIdFromHandle(frontendHandle));
} }
updateFrontendClientMappingOnRelease(frontendId);
} }
@Override @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) { for (int removingId : updatingFrontendIds) {
// update the exclusive group id member list // update the exclusive group id member list
removeFrontendResource(removingId); removeFrontendResource(removingId);
@@ -466,6 +467,14 @@ public class TunerResourceManagerService extends SystemService {
return false; return false;
} }
@VisibleForTesting
void releaseFrontendInternal(int frontendId) {
if (DEBUG) {
Slog.d(TAG, "releaseFrontend(id=" + frontendId + ")");
}
updateFrontendClientMappingOnRelease(frontendId);
}
@VisibleForTesting @VisibleForTesting
boolean requestDemuxInternal(TunerDemuxRequest request, int[] demuxHandle) { boolean requestDemuxInternal(TunerDemuxRequest request, int[] demuxHandle) {
if (DEBUG) { if (DEBUG) {
@@ -578,7 +587,7 @@ public class TunerResourceManagerService extends SystemService {
ownerProfile.releaseFrontend(frontendId); ownerProfile.releaseFrontend(frontendId);
for (int exclusiveGroupMember : releasingFrontend.getExclusiveGroupMemberFeIds()) { for (int exclusiveGroupMember : releasingFrontend.getExclusiveGroupMemberFeIds()) {
getFrontendResource(exclusiveGroupMember).removeOwner(); getFrontendResource(exclusiveGroupMember).removeOwner();
ownerProfile.releaseFrontend(frontendId); ownerProfile.releaseFrontend(exclusiveGroupMember);
} }
} }
@@ -623,6 +632,9 @@ public class TunerResourceManagerService extends SystemService {
private void removeFrontendResource(int removingId) { private void removeFrontendResource(int removingId) {
FrontendResource fe = getFrontendResource(removingId); FrontendResource fe = getFrontendResource(removingId);
if (fe.isInUse()) {
releaseFrontendInternal(removingId);
}
for (int excGroupmemberFeId : fe.getExclusiveGroupMemberFeIds()) { for (int excGroupmemberFeId : fe.getExclusiveGroupMemberFeIds()) {
getFrontendResource(excGroupmemberFeId) getFrontendResource(excGroupmemberFeId)
.removeExclusiveGroupMemberFeId(fe.getId()); .removeExclusiveGroupMemberFeId(fe.getId());
@@ -665,11 +677,22 @@ public class TunerResourceManagerService extends SystemService {
| (mResourceRequestCount++ & 0xffff); | (mResourceRequestCount++ & 0xffff);
} }
private int getResourceId( @VisibleForTesting
@TunerResourceManager.TunerResourceType int resourceType, int resourceHandle) { protected int getResourceIdFromHandle(int resourceHandle) {
if (resourceHandle == TunerResourceManager.INVALID_RESOURCE_HANDLE) {
return resourceHandle;
}
return (resourceHandle & 0x00ff0000) >> 16; 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) { private void enforceTrmAccessPermission(String apiName) {
getContext().enforceCallingPermission("android.permission.TUNER_RESOURCE_ACCESS", getContext().enforceCallingPermission("android.permission.TUNER_RESOURCE_ACCESS",
TAG + ": " + apiName); TAG + ": " + apiName);

View File

@@ -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 @Before
public void setUp() throws Exception { public void setUp() throws Exception {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
@@ -247,7 +240,7 @@ public class TunerResourceManagerServiceTest {
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} }
assertThat(getResourceIdFromHandle(frontendHandle[0])) assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
.isEqualTo(TunerResourceManager.INVALID_RESOURCE_HANDLE); .isEqualTo(TunerResourceManager.INVALID_RESOURCE_HANDLE);
} }
@@ -275,7 +268,7 @@ public class TunerResourceManagerServiceTest {
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} }
assertThat(getResourceIdFromHandle(frontendHandle[0])) assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
.isEqualTo(TunerResourceManager.INVALID_RESOURCE_HANDLE); .isEqualTo(TunerResourceManager.INVALID_RESOURCE_HANDLE);
} }
@@ -307,7 +300,8 @@ public class TunerResourceManagerServiceTest {
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} }
assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(0); assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
.isEqualTo(0);
} }
@Test @Test
@@ -344,7 +338,8 @@ public class TunerResourceManagerServiceTest {
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} }
assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[0].getId()); assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
.isEqualTo(infos[0].getId());
request = request =
new TunerFrontendRequest(clientId0[0] /*clientId*/, FrontendSettings.TYPE_DVBT); new TunerFrontendRequest(clientId0[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
@@ -354,7 +349,8 @@ public class TunerResourceManagerServiceTest {
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); 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()) assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
.isInUse()).isTrue(); .isInUse()).isTrue();
assertThat(mTunerResourceManagerService.getFrontendResource(infos[2].getId()) assertThat(mTunerResourceManagerService.getFrontendResource(infos[2].getId())
@@ -464,7 +460,8 @@ public class TunerResourceManagerServiceTest {
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); throw e.rethrowFromSystemServer();
} }
assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[0].getId()); assertThat(mTunerResourceManagerService.getResourceIdFromHandle(frontendHandle[0]))
.isEqualTo(infos[0].getId());
request = request =
new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBS); new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBS);
@@ -474,7 +471,8 @@ public class TunerResourceManagerServiceTest {
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); 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()) assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId())
.isInUse()).isTrue(); .isInUse()).isTrue();
assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId()) assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
@@ -486,6 +484,49 @@ public class TunerResourceManagerServiceTest {
assertThat(listener.isRelaimed()).isTrue(); 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 @Test
public void unregisterClientTest_usingFrontend() { public void unregisterClientTest_usingFrontend() {
// Register client // Register client
@@ -513,7 +554,8 @@ public class TunerResourceManagerServiceTest {
} catch (RemoteException e) { } catch (RemoteException e) {
throw e.rethrowFromSystemServer(); 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()) assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId())
.isInUse()).isTrue(); .isInUse()).isTrue();
assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId()) assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
@@ -543,7 +585,8 @@ public class TunerResourceManagerServiceTest {
TunerDemuxRequest request = new TunerDemuxRequest(clientId[0]); TunerDemuxRequest request = new TunerDemuxRequest(clientId[0]);
assertThat(mTunerResourceManagerService.requestDemuxInternal(request, demuxHandle)) assertThat(mTunerResourceManagerService.requestDemuxInternal(request, demuxHandle))
.isTrue(); .isTrue();
assertThat(getResourceIdFromHandle(demuxHandle[0])).isEqualTo(0); assertThat(mTunerResourceManagerService.getResourceIdFromHandle(demuxHandle[0]))
.isEqualTo(0);
} }
@Test @Test
@@ -560,6 +603,6 @@ public class TunerResourceManagerServiceTest {
TunerDescramblerRequest request = new TunerDescramblerRequest(clientId[0]); TunerDescramblerRequest request = new TunerDescramblerRequest(clientId[0]);
assertThat(mTunerResourceManagerService.requestDescramblerInternal(request, desHandle)) assertThat(mTunerResourceManagerService.requestDescramblerInternal(request, desHandle))
.isTrue(); .isTrue();
assertThat(getResourceIdFromHandle(desHandle[0])).isEqualTo(0); assertThat(mTunerResourceManagerService.getResourceIdFromHandle(desHandle[0])).isEqualTo(0);
} }
} }