diff options
3 files changed, 92 insertions, 54 deletions
diff --git a/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java b/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java index 524b6c2e26e1..9dddcd4eaa3b 100644 --- a/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java +++ b/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java @@ -60,11 +60,6 @@ public class TunerResourceManager { private static final String TAG = "TunerResourceManager"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); - public static final int INVALID_FRONTEND_ID = -1; - public static final int INVALID_CAS_SESSION_RESOURCE_ID = -1; - public static final int INVALID_LNB_ID = -1; - public static final int INVALID_TV_INPUT_DEVICE_ID = -1; - public static final int INVALID_TV_INPUT_PORT_ID = -1; public static final int INVALID_RESOURCE_HANDLE = -1; private final ITunerResourceManager mService; 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 5f65287f4f97..6c55926d65be 100644 --- a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java +++ b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java @@ -16,6 +16,7 @@ package com.android.server.tv.tunerresourcemanager; +import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; @@ -40,6 +41,8 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.server.SystemService; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -70,9 +73,31 @@ public class TunerResourceManagerService extends SystemService { private TvInputManager mManager; private UseCasePriorityHints mPriorityCongfig = new UseCasePriorityHints(); + // An internal resource request count to help generate resource handle. + private int mResourceRequestCount = 0; + // Used to synchronize the access to the service. private final Object mLock = new Object(); + /** + * Tuner resource type to help generate resource handle + */ + @IntDef({ + TUNER_RESOURCE_TYPE_FRONTEND, + TUNER_RESOURCE_TYPE_DEMUX, + TUNER_RESOURCE_TYPE_DESCRAMBLER, + TUNER_RESOURCE_TYPE_LNB, + TUNER_RESOURCE_TYPE_CAS_SESSION, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface TunerResourceType {} + + public static final int TUNER_RESOURCE_TYPE_FRONTEND = 0; + public static final int TUNER_RESOURCE_TYPE_DEMUX = 1; + public static final int TUNER_RESOURCE_TYPE_DESCRAMBLER = 2; + public static final int TUNER_RESOURCE_TYPE_LNB = 3; + public static final int TUNER_RESOURCE_TYPE_CAS_SESSION = 4; + public TunerResourceManagerService(@Nullable Context context) { super(context); } @@ -171,15 +196,15 @@ public class TunerResourceManagerService extends SystemService { @Override public boolean requestFrontend(@NonNull TunerFrontendRequest request, - @NonNull int[] frontendId) throws RemoteException { + @NonNull int[] frontendHandle) throws RemoteException { enforceTunerAccessPermission("requestFrontend"); enforceTrmAccessPermission("requestFrontend"); - if (frontendId == null) { + if (frontendHandle == null) { throw new RemoteException("frontendId can't be null"); } synchronized (mLock) { try { - return requestFrontendInternal(request, frontendId); + return requestFrontendInternal(request, frontendHandle); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -219,7 +244,7 @@ public class TunerResourceManagerService extends SystemService { @Override public boolean requestCasSession( - @NonNull CasSessionRequest request, @NonNull int[] sessionResourceId) { + @NonNull CasSessionRequest request, @NonNull int[] sessionResourceHandle) { enforceTrmAccessPermission("requestCasSession"); if (DEBUG) { Slog.d(TAG, "requestCasSession(request=" + request + ")"); @@ -229,7 +254,7 @@ public class TunerResourceManagerService extends SystemService { } @Override - public boolean requestLnb(@NonNull TunerLnbRequest request, @NonNull int[] lnbId) { + public boolean requestLnb(@NonNull TunerLnbRequest request, @NonNull int[] lnbHandle) { enforceTunerAccessPermission("requestLnb"); enforceTrmAccessPermission("requestLnb"); if (DEBUG) { @@ -393,13 +418,13 @@ public class TunerResourceManagerService extends SystemService { } @VisibleForTesting - protected boolean requestFrontendInternal(TunerFrontendRequest request, int[] frontendId) + protected boolean requestFrontendInternal(TunerFrontendRequest request, int[] frontendHandle) throws RemoteException { if (DEBUG) { Slog.d(TAG, "requestFrontend(request=" + request + ")"); } - frontendId[0] = TunerResourceManager.INVALID_FRONTEND_ID; + frontendHandle[0] = TunerResourceManager.INVALID_RESOURCE_HANDLE; if (!checkClientExists(request.getClientId())) { Slog.e(TAG, "Request frontend from unregistered client:" + request.getClientId()); return false; @@ -435,17 +460,20 @@ public class TunerResourceManagerService extends SystemService { // Grant frontend when there is unused resource. if (grantingFrontendId > -1) { - frontendId[0] = grantingFrontendId; - updateFrontendClientMappingOnNewGrant(frontendId[0], request.getClientId()); + frontendHandle[0] = generateResourceHandle( + TUNER_RESOURCE_TYPE_FRONTEND, grantingFrontendId); + updateFrontendClientMappingOnNewGrant(grantingFrontendId, request.getClientId()); return true; } // When all the resources are occupied, grant the lowest priority resource if the // request client has higher priority. if (inUseLowestPriorityFrId > -1 && (requestClient.getPriority() > currentLowestPriority)) { - frontendId[0] = inUseLowestPriorityFrId; - reclaimFrontendResource(getFrontendResource(frontendId[0]).getOwnerClientId()); - updateFrontendClientMappingOnNewGrant(frontendId[0], request.getClientId()); + frontendHandle[0] = generateResourceHandle( + TUNER_RESOURCE_TYPE_FRONTEND, inUseLowestPriorityFrId); + reclaimFrontendResource(getFrontendResource( + inUseLowestPriorityFrId).getOwnerClientId()); + updateFrontendClientMappingOnNewGrant(inUseLowestPriorityFrId, request.getClientId()); return true; } @@ -614,6 +642,12 @@ public class TunerResourceManagerService extends SystemService { return mClientProfiles.keySet().contains(clientId); } + private int generateResourceHandle(@TunerResourceType int resourceType, int resourceId) { + return (resourceType & 0x000000ff) << 24 + | (resourceId << 16) + | (mResourceRequestCount++ & 0xffff); + } + 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 8da3bdfdf38c..1b98fa85f926 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 @@ -92,6 +92,13 @@ 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); @@ -229,14 +236,15 @@ public class TunerResourceManagerServiceTest { public void requestFrontendTest_ClientNotRegistered() { TunerFrontendRequest request = new TunerFrontendRequest(0 /*clientId*/, FrontendSettings.TYPE_DVBT); - int[] frontendId = new int[1]; + int[] frontendHandle = new int[1]; try { - assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId)) - .isFalse(); + assertThat(mTunerResourceManagerService + .requestFrontendInternal(request, frontendHandle)).isFalse(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } - assertThat(frontendId[0]).isEqualTo(TunerResourceManager.INVALID_FRONTEND_ID); + assertThat(getResourceIdFromHandle(frontendHandle[0])) + .isEqualTo(TunerResourceManager.INVALID_RESOURCE_HANDLE); } @Test @@ -256,14 +264,15 @@ public class TunerResourceManagerServiceTest { TunerFrontendRequest request = new TunerFrontendRequest(clientId[0] /*clientId*/, FrontendSettings.TYPE_DVBT); - int[] frontendId = new int[1]; + int[] frontendHandle = new int[1]; try { - assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId)) - .isFalse(); + assertThat(mTunerResourceManagerService + .requestFrontendInternal(request, frontendHandle)).isFalse(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } - assertThat(frontendId[0]).isEqualTo(TunerResourceManager.INVALID_FRONTEND_ID); + assertThat(getResourceIdFromHandle(frontendHandle[0])) + .isEqualTo(TunerResourceManager.INVALID_RESOURCE_HANDLE); } @Test @@ -287,14 +296,14 @@ public class TunerResourceManagerServiceTest { TunerFrontendRequest request = new TunerFrontendRequest(clientId[0] /*clientId*/, FrontendSettings.TYPE_DVBT); - int[] frontendId = new int[1]; + int[] frontendHandle = new int[1]; try { - assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId)) - .isTrue(); + assertThat(mTunerResourceManagerService + .requestFrontendInternal(request, frontendHandle)).isTrue(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } - assertThat(frontendId[0]).isEqualTo(0); + assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(0); } @Test @@ -322,26 +331,26 @@ public class TunerResourceManagerServiceTest { new TunerFrontendInfo(2 /*id*/, FrontendSettings.TYPE_DVBS, 1 /*exclusiveGroupId*/); mTunerResourceManagerService.setFrontendInfoListInternal(infos); - int[] frontendId = new int[1]; + int[] frontendHandle = new int[1]; TunerFrontendRequest request = new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBT); try { - assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId)) - .isTrue(); + assertThat(mTunerResourceManagerService + .requestFrontendInternal(request, frontendHandle)).isTrue(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } - assertThat(frontendId[0]).isEqualTo(infos[0].getId()); + assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[0].getId()); request = new TunerFrontendRequest(clientId0[0] /*clientId*/, FrontendSettings.TYPE_DVBT); try { - assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId)) - .isTrue(); + assertThat(mTunerResourceManagerService + .requestFrontendInternal(request, frontendHandle)).isTrue(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } - assertThat(frontendId[0]).isEqualTo(infos[1].getId()); + assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[1].getId()); assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId()) .isInUse()).isTrue(); assertThat(mTunerResourceManagerService.getFrontendResource(infos[2].getId()) @@ -382,10 +391,10 @@ public class TunerResourceManagerServiceTest { TunerFrontendRequest request = new TunerFrontendRequest(clientId0[0] /*clientId*/, FrontendSettings.TYPE_DVBT); - int[] frontendId = new int[1]; + int[] frontendHandle = new int[1]; try { - assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId)) - .isTrue(); + assertThat(mTunerResourceManagerService + .requestFrontendInternal(request, frontendHandle)).isTrue(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -393,8 +402,8 @@ public class TunerResourceManagerServiceTest { request = new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBT); try { - assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId)) - .isFalse(); + assertThat(mTunerResourceManagerService + .requestFrontendInternal(request, frontendHandle)).isFalse(); assertThat(listener.isRelaimed()).isFalse(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); @@ -403,8 +412,8 @@ public class TunerResourceManagerServiceTest { request = new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBS); try { - assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId)) - .isFalse(); + assertThat(mTunerResourceManagerService + .requestFrontendInternal(request, frontendHandle)).isFalse(); assertThat(listener.isRelaimed()).isFalse(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); @@ -444,24 +453,24 @@ public class TunerResourceManagerServiceTest { TunerFrontendRequest request = new TunerFrontendRequest(clientId0[0] /*clientId*/, FrontendSettings.TYPE_DVBT); - int[] frontendId = new int[1]; + int[] frontendHandle = new int[1]; try { - assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId)) - .isTrue(); + assertThat(mTunerResourceManagerService + .requestFrontendInternal(request, frontendHandle)).isTrue(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } - assertThat(frontendId[0]).isEqualTo(infos[0].getId()); + assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[0].getId()); request = new TunerFrontendRequest(clientId1[0] /*clientId*/, FrontendSettings.TYPE_DVBS); try { - assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId)) - .isTrue(); + assertThat(mTunerResourceManagerService + .requestFrontendInternal(request, frontendHandle)).isTrue(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } - assertThat(frontendId[0]).isEqualTo(infos[1].getId()); + assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[1].getId()); assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId()) .isInUse()).isTrue(); assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId()) @@ -493,14 +502,14 @@ public class TunerResourceManagerServiceTest { TunerFrontendRequest request = new TunerFrontendRequest(clientId[0] /*clientId*/, FrontendSettings.TYPE_DVBT); - int[] frontendId = new int[1]; + int[] frontendHandle = new int[1]; try { - assertThat(mTunerResourceManagerService.requestFrontendInternal(request, frontendId)) - .isTrue(); + assertThat(mTunerResourceManagerService + .requestFrontendInternal(request, frontendHandle)).isTrue(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } - assertThat(frontendId[0]).isEqualTo(infos[0].getId()); + assertThat(getResourceIdFromHandle(frontendHandle[0])).isEqualTo(infos[0].getId()); assertThat(mTunerResourceManagerService.getFrontendResource(infos[0].getId()) .isInUse()).isTrue(); assertThat(mTunerResourceManagerService.getFrontendResource(infos[1].getId()) |