Loading media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java +0 −5 Original line number Diff line number Diff line Loading @@ -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; Loading services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java +86 −20 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); } Loading @@ -96,7 +121,7 @@ public class TunerResourceManagerService extends SystemService { public void registerClientProfile(@NonNull ResourceClientProfile profile, @NonNull IResourcesReclaimListener listener, @NonNull int[] clientId) throws RemoteException { enforceAccessPermission(); enforceTrmAccessPermission("registerClientProfile"); if (profile == null) { throw new RemoteException("ResourceClientProfile can't be null"); } Loading @@ -120,7 +145,7 @@ public class TunerResourceManagerService extends SystemService { @Override public void unregisterClientProfile(int clientId) throws RemoteException { enforceAccessPermission(); enforceTrmAccessPermission("unregisterClientProfile"); synchronized (mLock) { if (!checkClientExists(clientId)) { Slog.e(TAG, "Unregistering non exists client:" + clientId); Loading @@ -132,7 +157,7 @@ public class TunerResourceManagerService extends SystemService { @Override public boolean updateClientPriority(int clientId, int priority, int niceValue) { enforceAccessPermission(); enforceTrmAccessPermission("updateClientPriority"); synchronized (mLock) { return updateClientPriorityInternal(clientId, priority, niceValue); } Loading @@ -140,7 +165,7 @@ public class TunerResourceManagerService extends SystemService { @Override public void setFrontendInfoList(@NonNull TunerFrontendInfo[] infos) throws RemoteException { enforceAccessPermission(); enforceTrmAccessPermission("setFrontendInfoList"); if (infos == null) { throw new RemoteException("TunerFrontendInfo can't be null"); } Loading @@ -151,6 +176,7 @@ public class TunerResourceManagerService extends SystemService { @Override public void updateCasInfo(int casSystemId, int maxSessionNum) { enforceTrmAccessPermission("updateCasInfo"); if (DEBUG) { Slog.d(TAG, "updateCasInfo(casSystemId=" + casSystemId Loading @@ -160,6 +186,7 @@ public class TunerResourceManagerService extends SystemService { @Override public void setLnbInfoList(int[] lnbIds) { enforceTrmAccessPermission("setLnbInfoList"); if (DEBUG) { for (int i = 0; i < lnbIds.length; i++) { Slog.d(TAG, "updateLnbInfo(lnbId=" + lnbIds[i] + ")"); Loading @@ -169,14 +196,15 @@ public class TunerResourceManagerService extends SystemService { @Override public boolean requestFrontend(@NonNull TunerFrontendRequest request, @NonNull int[] frontendId) throws RemoteException { enforceAccessPermission(); if (frontendId == null) { @NonNull int[] frontendHandle) throws RemoteException { enforceTunerAccessPermission("requestFrontend"); enforceTrmAccessPermission("requestFrontend"); 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(); } Loading @@ -185,6 +213,8 @@ public class TunerResourceManagerService extends SystemService { @Override public void shareFrontend(int selfClientId, int targetClientId) { enforceTunerAccessPermission("shareFrontend"); enforceTrmAccessPermission("shareFrontend"); if (DEBUG) { Slog.d(TAG, "shareFrontend from " + selfClientId + " with " + targetClientId); } Loading @@ -193,6 +223,8 @@ public class TunerResourceManagerService extends SystemService { @Override public boolean requestDemux(@NonNull TunerDemuxRequest request, @NonNull int[] demuxHandle) { enforceTunerAccessPermission("requestDemux"); enforceTrmAccessPermission("requestDemux"); if (DEBUG) { Slog.d(TAG, "requestDemux(request=" + request + ")"); } Loading @@ -202,6 +234,8 @@ public class TunerResourceManagerService extends SystemService { @Override public boolean requestDescrambler(@NonNull TunerDescramblerRequest request, @NonNull int[] descrambleHandle) { enforceDescramblerAccessPermission("requestDescrambler"); enforceTrmAccessPermission("requestDescrambler"); if (DEBUG) { Slog.d(TAG, "requestDescrambler(request=" + request + ")"); } Loading @@ -210,7 +244,8 @@ 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 + ")"); } Loading @@ -219,7 +254,9 @@ 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) { Slog.d(TAG, "requestLnb(request=" + request + ")"); } Loading @@ -228,6 +265,8 @@ public class TunerResourceManagerService extends SystemService { @Override public void releaseFrontend(int frontendId) { enforceTunerAccessPermission("releaseFrontend"); enforceTrmAccessPermission("releaseFrontend"); if (DEBUG) { Slog.d(TAG, "releaseFrontend(id=" + frontendId + ")"); } Loading @@ -235,6 +274,8 @@ public class TunerResourceManagerService extends SystemService { @Override public void releaseDemux(int demuxHandle) { enforceTunerAccessPermission("releaseDemux"); enforceTrmAccessPermission("releaseDemux"); if (DEBUG) { Slog.d(TAG, "releaseDemux(demuxHandle=" + demuxHandle + ")"); } Loading @@ -242,6 +283,8 @@ public class TunerResourceManagerService extends SystemService { @Override public void releaseDescrambler(int descramblerHandle) { enforceTunerAccessPermission("releaseDescrambler"); enforceTrmAccessPermission("releaseDescrambler"); if (DEBUG) { Slog.d(TAG, "releaseDescrambler(descramblerHandle=" + descramblerHandle + ")"); } Loading @@ -249,6 +292,7 @@ public class TunerResourceManagerService extends SystemService { @Override public void releaseCasSession(int sessionResourceId) { enforceTrmAccessPermission("releaseCasSession"); if (DEBUG) { Slog.d(TAG, "releaseCasSession(sessionResourceId=" + sessionResourceId + ")"); } Loading @@ -256,6 +300,8 @@ public class TunerResourceManagerService extends SystemService { @Override public void releaseLnb(int lnbId) { enforceTunerAccessPermission("releaseLnb"); enforceTrmAccessPermission("releaseLnb"); if (DEBUG) { Slog.d(TAG, "releaseLnb(lnbId=" + lnbId + ")"); } Loading @@ -264,6 +310,7 @@ public class TunerResourceManagerService extends SystemService { @Override public boolean isHigherPriority( ResourceClientProfile challengerProfile, ResourceClientProfile holderProfile) { enforceTrmAccessPermission("isHigherPriority"); if (DEBUG) { Slog.d(TAG, "isHigherPriority(challengerProfile=" + challengerProfile Loading Loading @@ -371,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; Loading Loading @@ -413,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; } Loading Loading @@ -592,8 +642,24 @@ public class TunerResourceManagerService extends SystemService { return mClientProfiles.keySet().contains(clientId); } private void enforceAccessPermission() { getContext().enforceCallingOrSelfPermission( "android.permission.TUNER_RESOURCE_ACCESS", TAG); 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"); } private void enforceTunerAccessPermission(String apiName) { getContext().enforceCallingPermission("android.Manifest.permission.ACCESS_TV_TUNER", TAG + ": " + "apiName"); } private void enforceDescramblerAccessPermission(String apiName) { getContext().enforceCallingPermission("android.Manifest.permission.ACCESS_TV_DESCRAMBLER", TAG + ": " + "apiName"); } } services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java +46 −37 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading Loading @@ -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()) Loading Loading @@ -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(); } Loading @@ -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(); Loading @@ -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(); Loading Loading @@ -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()) Loading Loading @@ -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()) Loading Loading
media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java +0 −5 Original line number Diff line number Diff line Loading @@ -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; Loading
services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java +86 −20 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); } Loading @@ -96,7 +121,7 @@ public class TunerResourceManagerService extends SystemService { public void registerClientProfile(@NonNull ResourceClientProfile profile, @NonNull IResourcesReclaimListener listener, @NonNull int[] clientId) throws RemoteException { enforceAccessPermission(); enforceTrmAccessPermission("registerClientProfile"); if (profile == null) { throw new RemoteException("ResourceClientProfile can't be null"); } Loading @@ -120,7 +145,7 @@ public class TunerResourceManagerService extends SystemService { @Override public void unregisterClientProfile(int clientId) throws RemoteException { enforceAccessPermission(); enforceTrmAccessPermission("unregisterClientProfile"); synchronized (mLock) { if (!checkClientExists(clientId)) { Slog.e(TAG, "Unregistering non exists client:" + clientId); Loading @@ -132,7 +157,7 @@ public class TunerResourceManagerService extends SystemService { @Override public boolean updateClientPriority(int clientId, int priority, int niceValue) { enforceAccessPermission(); enforceTrmAccessPermission("updateClientPriority"); synchronized (mLock) { return updateClientPriorityInternal(clientId, priority, niceValue); } Loading @@ -140,7 +165,7 @@ public class TunerResourceManagerService extends SystemService { @Override public void setFrontendInfoList(@NonNull TunerFrontendInfo[] infos) throws RemoteException { enforceAccessPermission(); enforceTrmAccessPermission("setFrontendInfoList"); if (infos == null) { throw new RemoteException("TunerFrontendInfo can't be null"); } Loading @@ -151,6 +176,7 @@ public class TunerResourceManagerService extends SystemService { @Override public void updateCasInfo(int casSystemId, int maxSessionNum) { enforceTrmAccessPermission("updateCasInfo"); if (DEBUG) { Slog.d(TAG, "updateCasInfo(casSystemId=" + casSystemId Loading @@ -160,6 +186,7 @@ public class TunerResourceManagerService extends SystemService { @Override public void setLnbInfoList(int[] lnbIds) { enforceTrmAccessPermission("setLnbInfoList"); if (DEBUG) { for (int i = 0; i < lnbIds.length; i++) { Slog.d(TAG, "updateLnbInfo(lnbId=" + lnbIds[i] + ")"); Loading @@ -169,14 +196,15 @@ public class TunerResourceManagerService extends SystemService { @Override public boolean requestFrontend(@NonNull TunerFrontendRequest request, @NonNull int[] frontendId) throws RemoteException { enforceAccessPermission(); if (frontendId == null) { @NonNull int[] frontendHandle) throws RemoteException { enforceTunerAccessPermission("requestFrontend"); enforceTrmAccessPermission("requestFrontend"); 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(); } Loading @@ -185,6 +213,8 @@ public class TunerResourceManagerService extends SystemService { @Override public void shareFrontend(int selfClientId, int targetClientId) { enforceTunerAccessPermission("shareFrontend"); enforceTrmAccessPermission("shareFrontend"); if (DEBUG) { Slog.d(TAG, "shareFrontend from " + selfClientId + " with " + targetClientId); } Loading @@ -193,6 +223,8 @@ public class TunerResourceManagerService extends SystemService { @Override public boolean requestDemux(@NonNull TunerDemuxRequest request, @NonNull int[] demuxHandle) { enforceTunerAccessPermission("requestDemux"); enforceTrmAccessPermission("requestDemux"); if (DEBUG) { Slog.d(TAG, "requestDemux(request=" + request + ")"); } Loading @@ -202,6 +234,8 @@ public class TunerResourceManagerService extends SystemService { @Override public boolean requestDescrambler(@NonNull TunerDescramblerRequest request, @NonNull int[] descrambleHandle) { enforceDescramblerAccessPermission("requestDescrambler"); enforceTrmAccessPermission("requestDescrambler"); if (DEBUG) { Slog.d(TAG, "requestDescrambler(request=" + request + ")"); } Loading @@ -210,7 +244,8 @@ 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 + ")"); } Loading @@ -219,7 +254,9 @@ 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) { Slog.d(TAG, "requestLnb(request=" + request + ")"); } Loading @@ -228,6 +265,8 @@ public class TunerResourceManagerService extends SystemService { @Override public void releaseFrontend(int frontendId) { enforceTunerAccessPermission("releaseFrontend"); enforceTrmAccessPermission("releaseFrontend"); if (DEBUG) { Slog.d(TAG, "releaseFrontend(id=" + frontendId + ")"); } Loading @@ -235,6 +274,8 @@ public class TunerResourceManagerService extends SystemService { @Override public void releaseDemux(int demuxHandle) { enforceTunerAccessPermission("releaseDemux"); enforceTrmAccessPermission("releaseDemux"); if (DEBUG) { Slog.d(TAG, "releaseDemux(demuxHandle=" + demuxHandle + ")"); } Loading @@ -242,6 +283,8 @@ public class TunerResourceManagerService extends SystemService { @Override public void releaseDescrambler(int descramblerHandle) { enforceTunerAccessPermission("releaseDescrambler"); enforceTrmAccessPermission("releaseDescrambler"); if (DEBUG) { Slog.d(TAG, "releaseDescrambler(descramblerHandle=" + descramblerHandle + ")"); } Loading @@ -249,6 +292,7 @@ public class TunerResourceManagerService extends SystemService { @Override public void releaseCasSession(int sessionResourceId) { enforceTrmAccessPermission("releaseCasSession"); if (DEBUG) { Slog.d(TAG, "releaseCasSession(sessionResourceId=" + sessionResourceId + ")"); } Loading @@ -256,6 +300,8 @@ public class TunerResourceManagerService extends SystemService { @Override public void releaseLnb(int lnbId) { enforceTunerAccessPermission("releaseLnb"); enforceTrmAccessPermission("releaseLnb"); if (DEBUG) { Slog.d(TAG, "releaseLnb(lnbId=" + lnbId + ")"); } Loading @@ -264,6 +310,7 @@ public class TunerResourceManagerService extends SystemService { @Override public boolean isHigherPriority( ResourceClientProfile challengerProfile, ResourceClientProfile holderProfile) { enforceTrmAccessPermission("isHigherPriority"); if (DEBUG) { Slog.d(TAG, "isHigherPriority(challengerProfile=" + challengerProfile Loading Loading @@ -371,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; Loading Loading @@ -413,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; } Loading Loading @@ -592,8 +642,24 @@ public class TunerResourceManagerService extends SystemService { return mClientProfiles.keySet().contains(clientId); } private void enforceAccessPermission() { getContext().enforceCallingOrSelfPermission( "android.permission.TUNER_RESOURCE_ACCESS", TAG); 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"); } private void enforceTunerAccessPermission(String apiName) { getContext().enforceCallingPermission("android.Manifest.permission.ACCESS_TV_TUNER", TAG + ": " + "apiName"); } private void enforceDescramblerAccessPermission(String apiName) { getContext().enforceCallingPermission("android.Manifest.permission.ACCESS_TV_DESCRAMBLER", TAG + ": " + "apiName"); } }
services/tests/servicestests/src/com/android/server/tv/tunerresourcemanager/TunerResourceManagerServiceTest.java +46 −37 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading Loading @@ -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()) Loading Loading @@ -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(); } Loading @@ -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(); Loading @@ -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(); Loading Loading @@ -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()) Loading Loading @@ -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()) Loading