Complete Frontend release implementation in TRM
Test: atest Bug: 150952662 Change-Id: Iff876d2f2762724c3ad30d213e75cd364ea5ee87
This commit is contained in:
@@ -131,7 +131,7 @@ public final class ClientProfile {
|
||||
mUsingFrontendIds.add(frontendId);
|
||||
}
|
||||
|
||||
public Iterable<Integer> getInUseFrontendIds() {
|
||||
public Set<Integer> getInUseFrontendIds() {
|
||||
return mUsingFrontendIds;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user