Merge "Complete shareFrontend API implementation in TunerResourceManagerService"
This commit is contained in:
@@ -67,6 +67,11 @@ public final class ClientProfile {
|
|||||||
*/
|
*/
|
||||||
private Set<Integer> mUsingFrontendIds = new HashSet<>();
|
private Set<Integer> mUsingFrontendIds = new HashSet<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List of the client ids that share frontend with the current client.
|
||||||
|
*/
|
||||||
|
private Set<Integer> mShareFeClientIds = new HashSet<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List of the Lnb ids that are used by the current client.
|
* List of the Lnb ids that are used by the current client.
|
||||||
*/
|
*/
|
||||||
@@ -113,11 +118,7 @@ public final class ClientProfile {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public int getPriority() {
|
public int getPriority() {
|
||||||
return mPriority;
|
return mPriority - mNiceValue;
|
||||||
}
|
|
||||||
|
|
||||||
public int getNiceValue() {
|
|
||||||
return mNiceValue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setGroupId(int groupId) {
|
public void setGroupId(int groupId) {
|
||||||
@@ -141,17 +142,38 @@ public final class ClientProfile {
|
|||||||
mUsingFrontendIds.add(frontendId);
|
mUsingFrontendIds.add(frontendId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the set of client that share frontend with the current client.
|
||||||
|
*
|
||||||
|
* @param clientId the client to share the fe with the current client.
|
||||||
|
*/
|
||||||
|
public void shareFrontend(int clientId) {
|
||||||
|
mShareFeClientIds.add(clientId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the given client id from the share frontend client id set.
|
||||||
|
*
|
||||||
|
* @param clientId the client to stop sharing the fe with the current client.
|
||||||
|
*/
|
||||||
|
public void stopSharingFrontend(int clientId) {
|
||||||
|
mShareFeClientIds.remove(clientId);
|
||||||
|
}
|
||||||
|
|
||||||
public Set<Integer> getInUseFrontendIds() {
|
public Set<Integer> getInUseFrontendIds() {
|
||||||
return mUsingFrontendIds;
|
return mUsingFrontendIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Set<Integer> getShareFeClientIds() {
|
||||||
|
return mShareFeClientIds;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the client released a frontend.
|
* Called when the client released a frontend.
|
||||||
*
|
|
||||||
* @param frontendId being released.
|
|
||||||
*/
|
*/
|
||||||
public void releaseFrontend(int frontendId) {
|
public void releaseFrontend() {
|
||||||
mUsingFrontendIds.remove(frontendId);
|
mUsingFrontendIds.clear();
|
||||||
|
mShareFeClientIds.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -201,6 +223,7 @@ public final class ClientProfile {
|
|||||||
*/
|
*/
|
||||||
public void reclaimAllResources() {
|
public void reclaimAllResources() {
|
||||||
mUsingFrontendIds.clear();
|
mUsingFrontendIds.clear();
|
||||||
|
mShareFeClientIds.clear();
|
||||||
mUsingLnbIds.clear();
|
mUsingLnbIds.clear();
|
||||||
mUsingCasSystemId = INVALID_RESOURCE_ID;
|
mUsingCasSystemId = INVALID_RESOURCE_ID;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -213,16 +213,33 @@ public class TunerResourceManagerService extends SystemService implements IBinde
|
|||||||
throw new RemoteException("Request frontend from unregistered client: "
|
throw new RemoteException("Request frontend from unregistered client: "
|
||||||
+ request.getClientId());
|
+ request.getClientId());
|
||||||
}
|
}
|
||||||
|
// If the request client is holding or sharing a frontend, throw an exception.
|
||||||
|
if (!getClientProfile(request.getClientId()).getInUseFrontendIds().isEmpty()) {
|
||||||
|
throw new RemoteException("Release frontend before requesting another one. "
|
||||||
|
+ "Client id: " + request.getClientId());
|
||||||
|
}
|
||||||
return requestFrontendInternal(request, frontendHandle);
|
return requestFrontendInternal(request, frontendHandle);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void shareFrontend(int selfClientId, int targetClientId) {
|
public void shareFrontend(int selfClientId, int targetClientId) throws RemoteException {
|
||||||
enforceTunerAccessPermission("shareFrontend");
|
enforceTunerAccessPermission("shareFrontend");
|
||||||
enforceTrmAccessPermission("shareFrontend");
|
enforceTrmAccessPermission("shareFrontend");
|
||||||
if (DEBUG) {
|
synchronized (mLock) {
|
||||||
Slog.d(TAG, "shareFrontend from " + selfClientId + " with " + targetClientId);
|
if (!checkClientExists(selfClientId)) {
|
||||||
|
throw new RemoteException("Share frontend request from an unregistered client:"
|
||||||
|
+ selfClientId);
|
||||||
|
}
|
||||||
|
if (!checkClientExists(targetClientId)) {
|
||||||
|
throw new RemoteException("Request to share frontend with an unregistered "
|
||||||
|
+ "client:" + targetClientId);
|
||||||
|
}
|
||||||
|
if (getClientProfile(targetClientId).getInUseFrontendIds().isEmpty()) {
|
||||||
|
throw new RemoteException("Request to share frontend with a client that has no "
|
||||||
|
+ "frontend resources. Target client id:" + targetClientId);
|
||||||
|
}
|
||||||
|
shareFrontendInternal(selfClientId, targetClientId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -315,7 +332,7 @@ public class TunerResourceManagerService extends SystemService implements IBinde
|
|||||||
throw new RemoteException(
|
throw new RemoteException(
|
||||||
"Client is not the current owner of the releasing fe.");
|
"Client is not the current owner of the releasing fe.");
|
||||||
}
|
}
|
||||||
releaseFrontendInternal(fe);
|
releaseFrontendInternal(fe, clientId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -648,6 +665,17 @@ public class TunerResourceManagerService extends SystemService implements IBinde
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
protected void shareFrontendInternal(int selfClientId, int targetClientId) {
|
||||||
|
if (DEBUG) {
|
||||||
|
Slog.d(TAG, "shareFrontend from " + selfClientId + " with " + targetClientId);
|
||||||
|
}
|
||||||
|
for (int feId : getClientProfile(targetClientId).getInUseFrontendIds()) {
|
||||||
|
getClientProfile(selfClientId).useFrontend(feId);
|
||||||
|
}
|
||||||
|
getClientProfile(targetClientId).shareFrontend(selfClientId);
|
||||||
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
protected boolean requestLnbInternal(TunerLnbRequest request, int[] lnbHandle) {
|
protected boolean requestLnbInternal(TunerLnbRequest request, int[] lnbHandle) {
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
@@ -777,11 +805,17 @@ public class TunerResourceManagerService extends SystemService implements IBinde
|
|||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
protected void releaseFrontendInternal(FrontendResource fe) {
|
protected void releaseFrontendInternal(FrontendResource fe, int clientId) {
|
||||||
if (DEBUG) {
|
if (DEBUG) {
|
||||||
Slog.d(TAG, "releaseFrontend(id=" + fe.getId() + ")");
|
Slog.d(TAG, "releaseFrontend(id=" + fe.getId() + ", clientId=" + clientId + " )");
|
||||||
}
|
}
|
||||||
updateFrontendClientMappingOnRelease(fe);
|
if (clientId == fe.getOwnerClientId()) {
|
||||||
|
ClientProfile ownerClient = getClientProfile(fe.getOwnerClientId());
|
||||||
|
for (int shareOwnerId : ownerClient.getShareFeClientIds()) {
|
||||||
|
clearFrontendAndClientMapping(getClientProfile(shareOwnerId));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
clearFrontendAndClientMapping(getClientProfile(clientId));
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
@@ -882,8 +916,21 @@ public class TunerResourceManagerService extends SystemService implements IBinde
|
|||||||
Slog.e(TAG, "Failed to reclaim resources on client " + reclaimingClientId, e);
|
Slog.e(TAG, "Failed to reclaim resources on client " + reclaimingClientId, e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reclaim all the resources of the share owners of the frontend that is used by the current
|
||||||
|
// resource reclaimed client.
|
||||||
ClientProfile profile = getClientProfile(reclaimingClientId);
|
ClientProfile profile = getClientProfile(reclaimingClientId);
|
||||||
reclaimingResourcesFromClient(profile);
|
Set<Integer> shareFeClientIds = profile.getShareFeClientIds();
|
||||||
|
for (int clientId : shareFeClientIds) {
|
||||||
|
try {
|
||||||
|
mListeners.get(clientId).getListener().onReclaimResources();
|
||||||
|
} catch (RemoteException e) {
|
||||||
|
Slog.e(TAG, "Failed to reclaim resources on client " + clientId, e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
clearAllResourcesAndClientMapping(getClientProfile(clientId));
|
||||||
|
}
|
||||||
|
clearAllResourcesAndClientMapping(profile);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -929,16 +976,6 @@ public class TunerResourceManagerService extends SystemService implements IBinde
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateFrontendClientMappingOnRelease(@NonNull FrontendResource releasingFrontend) {
|
|
||||||
ClientProfile ownerProfile = getClientProfile(releasingFrontend.getOwnerClientId());
|
|
||||||
releasingFrontend.removeOwner();
|
|
||||||
ownerProfile.releaseFrontend(releasingFrontend.getId());
|
|
||||||
for (int exclusiveGroupMember : releasingFrontend.getExclusiveGroupMemberFeIds()) {
|
|
||||||
getFrontendResource(exclusiveGroupMember).removeOwner();
|
|
||||||
ownerProfile.releaseFrontend(exclusiveGroupMember);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updateLnbClientMappingOnNewGrant(int grantingId, int ownerClientId) {
|
private void updateLnbClientMappingOnNewGrant(int grantingId, int ownerClientId) {
|
||||||
LnbResource grantingLnb = getLnbResource(grantingId);
|
LnbResource grantingLnb = getLnbResource(grantingId);
|
||||||
ClientProfile ownerProfile = getClientProfile(ownerClientId);
|
ClientProfile ownerProfile = getClientProfile(ownerClientId);
|
||||||
@@ -967,10 +1004,10 @@ public class TunerResourceManagerService extends SystemService implements IBinde
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the owner client's priority from the resource id.
|
* Get the owner client's priority.
|
||||||
*
|
*
|
||||||
* @param clientId the owner client id.
|
* @param clientId the owner client id.
|
||||||
* @return the priority of the owner client of the resource.
|
* @return the priority of the owner client.
|
||||||
*/
|
*/
|
||||||
private int getOwnerClientPriority(int clientId) {
|
private int getOwnerClientPriority(int clientId) {
|
||||||
return getClientProfile(clientId).getPriority();
|
return getClientProfile(clientId).getPriority();
|
||||||
@@ -1011,7 +1048,11 @@ public class TunerResourceManagerService extends SystemService implements IBinde
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (fe.isInUse()) {
|
if (fe.isInUse()) {
|
||||||
releaseFrontendInternal(fe);
|
ClientProfile ownerClient = getClientProfile(fe.getOwnerClientId());
|
||||||
|
for (int shareOwnerId : ownerClient.getShareFeClientIds()) {
|
||||||
|
clearFrontendAndClientMapping(getClientProfile(shareOwnerId));
|
||||||
|
}
|
||||||
|
clearFrontendAndClientMapping(ownerClient);
|
||||||
}
|
}
|
||||||
for (int excGroupmemberFeId : fe.getExclusiveGroupMemberFeIds()) {
|
for (int excGroupmemberFeId : fe.getExclusiveGroupMemberFeIds()) {
|
||||||
getFrontendResource(excGroupmemberFeId)
|
getFrontendResource(excGroupmemberFeId)
|
||||||
@@ -1093,21 +1134,37 @@ public class TunerResourceManagerService extends SystemService implements IBinde
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void removeClientProfile(int clientId) {
|
private void removeClientProfile(int clientId) {
|
||||||
reclaimingResourcesFromClient(getClientProfile(clientId));
|
for (int shareOwnerId : getClientProfile(clientId).getShareFeClientIds()) {
|
||||||
|
clearFrontendAndClientMapping(getClientProfile(shareOwnerId));
|
||||||
|
}
|
||||||
|
clearAllResourcesAndClientMapping(getClientProfile(clientId));
|
||||||
mClientProfiles.remove(clientId);
|
mClientProfiles.remove(clientId);
|
||||||
mListeners.remove(clientId);
|
mListeners.remove(clientId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void reclaimingResourcesFromClient(ClientProfile profile) {
|
private void clearFrontendAndClientMapping(ClientProfile profile) {
|
||||||
for (Integer feId : profile.getInUseFrontendIds()) {
|
for (Integer feId : profile.getInUseFrontendIds()) {
|
||||||
getFrontendResource(feId).removeOwner();
|
FrontendResource fe = getFrontendResource(feId);
|
||||||
|
if (fe.getOwnerClientId() == profile.getId()) {
|
||||||
|
fe.removeOwner();
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
getClientProfile(fe.getOwnerClientId()).stopSharingFrontend(profile.getId());
|
||||||
|
}
|
||||||
|
profile.releaseFrontend();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void clearAllResourcesAndClientMapping(ClientProfile profile) {
|
||||||
|
// Clear Lnb
|
||||||
for (Integer lnbId : profile.getInUseLnbIds()) {
|
for (Integer lnbId : profile.getInUseLnbIds()) {
|
||||||
getLnbResource(lnbId).removeOwner();
|
getLnbResource(lnbId).removeOwner();
|
||||||
}
|
}
|
||||||
|
// Clear Cas
|
||||||
if (profile.getInUseCasSystemId() != ClientProfile.INVALID_RESOURCE_ID) {
|
if (profile.getInUseCasSystemId() != ClientProfile.INVALID_RESOURCE_ID) {
|
||||||
getCasResource(profile.getInUseCasSystemId()).removeOwner(profile.getId());
|
getCasResource(profile.getInUseCasSystemId()).removeOwner(profile.getId());
|
||||||
}
|
}
|
||||||
|
// Clear Frontend
|
||||||
|
clearFrontendAndClientMapping(profile);
|
||||||
profile.reclaimAllResources();
|
profile.reclaimAllResources();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ public class TunerResourceManagerServiceTest {
|
|||||||
mReclaimed = true;
|
mReclaimed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isRelaimed() {
|
public boolean isReclaimed() {
|
||||||
return mReclaimed;
|
return mReclaimed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -379,13 +379,13 @@ public class TunerResourceManagerServiceTest {
|
|||||||
new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
|
new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBT);
|
||||||
assertThat(mTunerResourceManagerService
|
assertThat(mTunerResourceManagerService
|
||||||
.requestFrontendInternal(request, frontendHandle)).isFalse();
|
.requestFrontendInternal(request, frontendHandle)).isFalse();
|
||||||
assertThat(listener.isRelaimed()).isFalse();
|
assertThat(listener.isReclaimed()).isFalse();
|
||||||
|
|
||||||
request =
|
request =
|
||||||
new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBS);
|
new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBS);
|
||||||
assertThat(mTunerResourceManagerService
|
assertThat(mTunerResourceManagerService
|
||||||
.requestFrontendInternal(request, frontendHandle)).isFalse();
|
.requestFrontendInternal(request, frontendHandle)).isFalse();
|
||||||
assertThat(listener.isRelaimed()).isFalse();
|
assertThat(listener.isReclaimed()).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -444,7 +444,7 @@ public class TunerResourceManagerServiceTest {
|
|||||||
.getOwnerClientId()).isEqualTo(clientId1[0]);
|
.getOwnerClientId()).isEqualTo(clientId1[0]);
|
||||||
assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
|
assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
|
||||||
.getOwnerClientId()).isEqualTo(clientId1[0]);
|
.getOwnerClientId()).isEqualTo(clientId1[0]);
|
||||||
assertThat(listener.isRelaimed()).isTrue();
|
assertThat(listener.isReclaimed()).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -478,7 +478,7 @@ public class TunerResourceManagerServiceTest {
|
|||||||
|
|
||||||
// Release frontend
|
// Release frontend
|
||||||
mTunerResourceManagerService.releaseFrontendInternal(mTunerResourceManagerService
|
mTunerResourceManagerService.releaseFrontendInternal(mTunerResourceManagerService
|
||||||
.getFrontendResource(frontendId));
|
.getFrontendResource(frontendId), clientId[0]);
|
||||||
assertThat(mTunerResourceManagerService
|
assertThat(mTunerResourceManagerService
|
||||||
.getFrontendResource(frontendId).isInUse()).isFalse();
|
.getFrontendResource(frontendId).isInUse()).isFalse();
|
||||||
assertThat(mTunerResourceManagerService
|
assertThat(mTunerResourceManagerService
|
||||||
@@ -540,7 +540,7 @@ public class TunerResourceManagerServiceTest {
|
|||||||
assertThat(mTunerResourceManagerService.getCasResource(1)
|
assertThat(mTunerResourceManagerService.getCasResource(1)
|
||||||
.getOwnerClientIds()).isEqualTo(new HashSet<Integer>(Arrays.asList(clientId1[0])));
|
.getOwnerClientIds()).isEqualTo(new HashSet<Integer>(Arrays.asList(clientId1[0])));
|
||||||
assertThat(mTunerResourceManagerService.getCasResource(1).isFullyUsed()).isFalse();
|
assertThat(mTunerResourceManagerService.getCasResource(1).isFullyUsed()).isFalse();
|
||||||
assertThat(listener.isRelaimed()).isTrue();
|
assertThat(listener.isReclaimed()).isTrue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -625,7 +625,7 @@ public class TunerResourceManagerServiceTest {
|
|||||||
.isInUse()).isTrue();
|
.isInUse()).isTrue();
|
||||||
assertThat(mTunerResourceManagerService.getLnbResource(lnbIds[0])
|
assertThat(mTunerResourceManagerService.getLnbResource(lnbIds[0])
|
||||||
.getOwnerClientId()).isEqualTo(clientId1[0]);
|
.getOwnerClientId()).isEqualTo(clientId1[0]);
|
||||||
assertThat(listener.isRelaimed()).isTrue();
|
assertThat(listener.isReclaimed()).isTrue();
|
||||||
assertThat(mTunerResourceManagerService.getClientProfile(clientId0[0])
|
assertThat(mTunerResourceManagerService.getClientProfile(clientId0[0])
|
||||||
.getInUseLnbIds().size()).isEqualTo(0);
|
.getInUseLnbIds().size()).isEqualTo(0);
|
||||||
}
|
}
|
||||||
@@ -753,4 +753,293 @@ public class TunerResourceManagerServiceTest {
|
|||||||
backgroundRecordProfile)).isEqualTo(
|
backgroundRecordProfile)).isEqualTo(
|
||||||
(backgroundPlaybackPriority > backgroundRecordPriority));
|
(backgroundPlaybackPriority > backgroundRecordPriority));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shareFrontendTest_FrontendWithExclusiveGroupReadyToShare() {
|
||||||
|
/**** Register Clients and Set Priority ****/
|
||||||
|
|
||||||
|
// Int array to save the returned client ids
|
||||||
|
int[] ownerClientId0 = new int[1];
|
||||||
|
int[] ownerClientId1 = new int[1];
|
||||||
|
int[] shareClientId0 = new int[1];
|
||||||
|
int[] shareClientId1 = new int[1];
|
||||||
|
|
||||||
|
// Predefined client profiles
|
||||||
|
ResourceClientProfile[] ownerProfiles = new ResourceClientProfile[2];
|
||||||
|
ResourceClientProfile[] shareProfiles = new ResourceClientProfile[2];
|
||||||
|
ownerProfiles[0] = new ResourceClientProfile(
|
||||||
|
"0" /*sessionId*/,
|
||||||
|
TvInputService.PRIORITY_HINT_USE_CASE_TYPE_LIVE);
|
||||||
|
ownerProfiles[1] = new ResourceClientProfile(
|
||||||
|
"1" /*sessionId*/,
|
||||||
|
TvInputService.PRIORITY_HINT_USE_CASE_TYPE_LIVE);
|
||||||
|
shareProfiles[0] = new ResourceClientProfile(
|
||||||
|
"2" /*sessionId*/,
|
||||||
|
TvInputService.PRIORITY_HINT_USE_CASE_TYPE_RECORD);
|
||||||
|
shareProfiles[1] = new ResourceClientProfile(
|
||||||
|
"3" /*sessionId*/,
|
||||||
|
TvInputService.PRIORITY_HINT_USE_CASE_TYPE_RECORD);
|
||||||
|
|
||||||
|
// Predefined client reclaim listeners
|
||||||
|
TestResourcesReclaimListener ownerListener0 = new TestResourcesReclaimListener();
|
||||||
|
TestResourcesReclaimListener shareListener0 = new TestResourcesReclaimListener();
|
||||||
|
TestResourcesReclaimListener ownerListener1 = new TestResourcesReclaimListener();
|
||||||
|
TestResourcesReclaimListener shareListener1 = new TestResourcesReclaimListener();
|
||||||
|
// Register clients and validate the returned client ids
|
||||||
|
mTunerResourceManagerService
|
||||||
|
.registerClientProfileInternal(ownerProfiles[0], ownerListener0, ownerClientId0);
|
||||||
|
mTunerResourceManagerService
|
||||||
|
.registerClientProfileInternal(shareProfiles[0], shareListener0, shareClientId0);
|
||||||
|
mTunerResourceManagerService
|
||||||
|
.registerClientProfileInternal(ownerProfiles[1], ownerListener1, ownerClientId1);
|
||||||
|
mTunerResourceManagerService
|
||||||
|
.registerClientProfileInternal(shareProfiles[1], shareListener1, shareClientId1);
|
||||||
|
assertThat(ownerClientId0[0]).isNotEqualTo(TunerResourceManagerService.INVALID_CLIENT_ID);
|
||||||
|
assertThat(shareClientId0[0]).isNotEqualTo(TunerResourceManagerService.INVALID_CLIENT_ID);
|
||||||
|
assertThat(ownerClientId1[0]).isNotEqualTo(TunerResourceManagerService.INVALID_CLIENT_ID);
|
||||||
|
assertThat(shareClientId1[0]).isNotEqualTo(TunerResourceManagerService.INVALID_CLIENT_ID);
|
||||||
|
|
||||||
|
mTunerResourceManagerService.updateClientPriorityInternal(
|
||||||
|
ownerClientId0[0],
|
||||||
|
100/*priority*/,
|
||||||
|
0/*niceValue*/);
|
||||||
|
mTunerResourceManagerService.updateClientPriorityInternal(
|
||||||
|
shareClientId0[0],
|
||||||
|
200/*priority*/,
|
||||||
|
0/*niceValue*/);
|
||||||
|
mTunerResourceManagerService.updateClientPriorityInternal(
|
||||||
|
ownerClientId1[0],
|
||||||
|
300/*priority*/,
|
||||||
|
0/*niceValue*/);
|
||||||
|
mTunerResourceManagerService.updateClientPriorityInternal(
|
||||||
|
shareClientId1[0],
|
||||||
|
400/*priority*/,
|
||||||
|
0/*niceValue*/);
|
||||||
|
|
||||||
|
/**** Init Frontend Resources ****/
|
||||||
|
|
||||||
|
// Predefined frontend info
|
||||||
|
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*/);
|
||||||
|
|
||||||
|
/**** Init Lnb Resources ****/
|
||||||
|
int[] lnbIds = {1};
|
||||||
|
mTunerResourceManagerService.setLnbInfoListInternal(lnbIds);
|
||||||
|
|
||||||
|
// Update frontend list in TRM
|
||||||
|
mTunerResourceManagerService.setFrontendInfoListInternal(infos);
|
||||||
|
|
||||||
|
/**** Request Frontend ****/
|
||||||
|
|
||||||
|
// Predefined frontend request and array to save returned frontend handle
|
||||||
|
int[] frontendHandle = new int[1];
|
||||||
|
TunerFrontendRequest request = new TunerFrontendRequest(
|
||||||
|
ownerClientId0[0] /*clientId*/,
|
||||||
|
FrontendSettings.TYPE_DVBT);
|
||||||
|
|
||||||
|
// Request call and validate granted resource and internal mapping
|
||||||
|
assertThat(mTunerResourceManagerService
|
||||||
|
.requestFrontendInternal(request, frontendHandle))
|
||||||
|
.isTrue();
|
||||||
|
assertThat(mTunerResourceManagerService
|
||||||
|
.getResourceIdFromHandle(frontendHandle[0]))
|
||||||
|
.isEqualTo(infos[0].getId());
|
||||||
|
assertThat(mTunerResourceManagerService
|
||||||
|
.getClientProfile(ownerClientId0[0])
|
||||||
|
.getInUseFrontendIds())
|
||||||
|
.isEqualTo(new HashSet<Integer>(Arrays.asList(
|
||||||
|
infos[0].getId(),
|
||||||
|
infos[1].getId())));
|
||||||
|
|
||||||
|
/**** Share Frontend ****/
|
||||||
|
|
||||||
|
// Share frontend call and validate the internal mapping
|
||||||
|
mTunerResourceManagerService.shareFrontendInternal(
|
||||||
|
shareClientId0[0]/*selfClientId*/,
|
||||||
|
ownerClientId0[0]/*targetClientId*/);
|
||||||
|
mTunerResourceManagerService.shareFrontendInternal(
|
||||||
|
shareClientId1[0]/*selfClientId*/,
|
||||||
|
ownerClientId0[0]/*targetClientId*/);
|
||||||
|
// Verify fe in use status
|
||||||
|
assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId())
|
||||||
|
.isInUse()).isTrue();
|
||||||
|
assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
|
||||||
|
.isInUse()).isTrue();
|
||||||
|
// Verify fe owner status
|
||||||
|
assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId())
|
||||||
|
.getOwnerClientId()).isEqualTo(ownerClientId0[0]);
|
||||||
|
assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
|
||||||
|
.getOwnerClientId()).isEqualTo(ownerClientId0[0]);
|
||||||
|
// Verify share fe client status in the primary owner client
|
||||||
|
assertThat(mTunerResourceManagerService.getClientProfile(ownerClientId0[0])
|
||||||
|
.getShareFeClientIds())
|
||||||
|
.isEqualTo(new HashSet<Integer>(Arrays.asList(
|
||||||
|
shareClientId0[0],
|
||||||
|
shareClientId1[0])));
|
||||||
|
// Verify in use frontend list in all the primary owner and share owner clients
|
||||||
|
assertThat(mTunerResourceManagerService
|
||||||
|
.getClientProfile(ownerClientId0[0])
|
||||||
|
.getInUseFrontendIds())
|
||||||
|
.isEqualTo(new HashSet<Integer>(Arrays.asList(
|
||||||
|
infos[0].getId(),
|
||||||
|
infos[1].getId())));
|
||||||
|
assertThat(mTunerResourceManagerService
|
||||||
|
.getClientProfile(shareClientId0[0])
|
||||||
|
.getInUseFrontendIds())
|
||||||
|
.isEqualTo(new HashSet<Integer>(Arrays.asList(
|
||||||
|
infos[0].getId(),
|
||||||
|
infos[1].getId())));
|
||||||
|
assertThat(mTunerResourceManagerService
|
||||||
|
.getClientProfile(shareClientId1[0])
|
||||||
|
.getInUseFrontendIds())
|
||||||
|
.isEqualTo(new HashSet<Integer>(Arrays.asList(
|
||||||
|
infos[0].getId(),
|
||||||
|
infos[1].getId())));
|
||||||
|
|
||||||
|
/**** Remove Frontend Share Owner ****/
|
||||||
|
|
||||||
|
// Unregister the second share fe client
|
||||||
|
mTunerResourceManagerService.unregisterClientProfileInternal(shareClientId1[0]);
|
||||||
|
|
||||||
|
// Validate the internal mapping
|
||||||
|
assertThat(mTunerResourceManagerService.getClientProfile(ownerClientId0[0])
|
||||||
|
.getShareFeClientIds())
|
||||||
|
.isEqualTo(new HashSet<Integer>(Arrays.asList(
|
||||||
|
shareClientId0[0])));
|
||||||
|
assertThat(mTunerResourceManagerService
|
||||||
|
.getClientProfile(ownerClientId0[0])
|
||||||
|
.getInUseFrontendIds())
|
||||||
|
.isEqualTo(new HashSet<Integer>(Arrays.asList(
|
||||||
|
infos[0].getId(),
|
||||||
|
infos[1].getId())));
|
||||||
|
assertThat(mTunerResourceManagerService
|
||||||
|
.getClientProfile(shareClientId0[0])
|
||||||
|
.getInUseFrontendIds())
|
||||||
|
.isEqualTo(new HashSet<Integer>(Arrays.asList(
|
||||||
|
infos[0].getId(),
|
||||||
|
infos[1].getId())));
|
||||||
|
|
||||||
|
/**** Request Shared Frontend with Higher Priority Client ****/
|
||||||
|
|
||||||
|
// Predefined second frontend request
|
||||||
|
request = new TunerFrontendRequest(
|
||||||
|
ownerClientId1[0] /*clientId*/,
|
||||||
|
FrontendSettings.TYPE_DVBT);
|
||||||
|
|
||||||
|
// Second request call
|
||||||
|
assertThat(mTunerResourceManagerService
|
||||||
|
.requestFrontendInternal(request, frontendHandle))
|
||||||
|
.isTrue();
|
||||||
|
|
||||||
|
// Validate granted resource and internal mapping
|
||||||
|
assertThat(mTunerResourceManagerService
|
||||||
|
.getResourceIdFromHandle(frontendHandle[0]))
|
||||||
|
.isEqualTo(infos[0].getId());
|
||||||
|
assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId())
|
||||||
|
.getOwnerClientId()).isEqualTo(ownerClientId1[0]);
|
||||||
|
assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
|
||||||
|
.getOwnerClientId()).isEqualTo(ownerClientId1[0]);
|
||||||
|
assertThat(mTunerResourceManagerService
|
||||||
|
.getClientProfile(ownerClientId1[0])
|
||||||
|
.getInUseFrontendIds())
|
||||||
|
.isEqualTo(new HashSet<Integer>(Arrays.asList(
|
||||||
|
infos[0].getId(),
|
||||||
|
infos[1].getId())));
|
||||||
|
assertThat(mTunerResourceManagerService
|
||||||
|
.getClientProfile(ownerClientId0[0])
|
||||||
|
.getInUseFrontendIds()
|
||||||
|
.isEmpty())
|
||||||
|
.isTrue();
|
||||||
|
assertThat(mTunerResourceManagerService
|
||||||
|
.getClientProfile(shareClientId0[0])
|
||||||
|
.getInUseFrontendIds()
|
||||||
|
.isEmpty())
|
||||||
|
.isTrue();
|
||||||
|
assertThat(mTunerResourceManagerService
|
||||||
|
.getClientProfile(ownerClientId0[0])
|
||||||
|
.getShareFeClientIds()
|
||||||
|
.isEmpty())
|
||||||
|
.isTrue();
|
||||||
|
assertThat(ownerListener0.isReclaimed()).isTrue();
|
||||||
|
assertThat(shareListener0.isReclaimed()).isTrue();
|
||||||
|
|
||||||
|
/**** Release Frontend Resource From Primary Owner ****/
|
||||||
|
|
||||||
|
// Reshare the frontend
|
||||||
|
mTunerResourceManagerService.shareFrontendInternal(
|
||||||
|
shareClientId0[0]/*selfClientId*/,
|
||||||
|
ownerClientId1[0]/*targetClientId*/);
|
||||||
|
|
||||||
|
// Release the frontend resource from the primary owner
|
||||||
|
mTunerResourceManagerService.releaseFrontendInternal(mTunerResourceManagerService
|
||||||
|
.getFrontendResource(infos[0].getId()), ownerClientId1[0]);
|
||||||
|
|
||||||
|
// Validate the internal mapping
|
||||||
|
assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId())
|
||||||
|
.isInUse()).isFalse();
|
||||||
|
assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
|
||||||
|
.isInUse()).isFalse();
|
||||||
|
// Verify client status
|
||||||
|
assertThat(mTunerResourceManagerService
|
||||||
|
.getClientProfile(ownerClientId1[0])
|
||||||
|
.getInUseFrontendIds()
|
||||||
|
.isEmpty())
|
||||||
|
.isTrue();
|
||||||
|
assertThat(mTunerResourceManagerService
|
||||||
|
.getClientProfile(shareClientId0[0])
|
||||||
|
.getInUseFrontendIds()
|
||||||
|
.isEmpty())
|
||||||
|
.isTrue();
|
||||||
|
assertThat(mTunerResourceManagerService
|
||||||
|
.getClientProfile(ownerClientId1[0])
|
||||||
|
.getShareFeClientIds()
|
||||||
|
.isEmpty())
|
||||||
|
.isTrue();
|
||||||
|
|
||||||
|
/**** Unregister Primary Owner when the Share owner owns an Lnb ****/
|
||||||
|
|
||||||
|
// Predefined Lnb request and handle array
|
||||||
|
TunerLnbRequest requestLnb = new TunerLnbRequest(shareClientId0[0]);
|
||||||
|
int[] lnbHandle = new int[1];
|
||||||
|
|
||||||
|
// Request for an Lnb
|
||||||
|
assertThat(mTunerResourceManagerService
|
||||||
|
.requestLnbInternal(requestLnb, lnbHandle))
|
||||||
|
.isTrue();
|
||||||
|
|
||||||
|
// Request and share the frontend resource again
|
||||||
|
assertThat(mTunerResourceManagerService
|
||||||
|
.requestFrontendInternal(request, frontendHandle))
|
||||||
|
.isTrue();
|
||||||
|
mTunerResourceManagerService.shareFrontendInternal(
|
||||||
|
shareClientId0[0]/*selfClientId*/,
|
||||||
|
ownerClientId1[0]/*targetClientId*/);
|
||||||
|
|
||||||
|
// Unregister the primary owner of the shared frontend
|
||||||
|
mTunerResourceManagerService.unregisterClientProfileInternal(ownerClientId1[0]);
|
||||||
|
|
||||||
|
// Validate the internal mapping
|
||||||
|
assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId())
|
||||||
|
.isInUse()).isFalse();
|
||||||
|
assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId())
|
||||||
|
.isInUse()).isFalse();
|
||||||
|
// Verify client status
|
||||||
|
assertThat(mTunerResourceManagerService
|
||||||
|
.getClientProfile(shareClientId0[0])
|
||||||
|
.getInUseFrontendIds()
|
||||||
|
.isEmpty())
|
||||||
|
.isTrue();
|
||||||
|
assertThat(mTunerResourceManagerService
|
||||||
|
.getClientProfile(shareClientId0[0])
|
||||||
|
.getInUseLnbIds())
|
||||||
|
.isEqualTo(new HashSet<Integer>(Arrays.asList(
|
||||||
|
lnbIds[0])));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user