From c18cc10d790985ec94342fd88f26f4eaaa732840 Mon Sep 17 00:00:00 2001 From: shubang Date: Thu, 12 Mar 2020 16:28:45 -0700 Subject: [PATCH] Tuner API: get resources from TRM and check permissions there Bug: 149785806 Test: mmm; Change-Id: I321fe7d97ee406c93ed73dbf440cc045f0b514df --- media/java/android/media/tv/tuner/Tuner.java | 88 +++++++++---------- .../TunerResourceManager.java | 21 +++++ media/jni/android_media_tv_Tuner.cpp | 19 ++-- .../TunerResourceManagerService.java | 34 ++----- 4 files changed, 84 insertions(+), 78 deletions(-) diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java index 21e11b523d6a3..d24d75260395a 100644 --- a/media/java/android/media/tv/tuner/Tuner.java +++ b/media/java/android/media/tv/tuner/Tuner.java @@ -43,6 +43,7 @@ import android.media.tv.tuner.frontend.FrontendStatus.FrontendStatusType; import android.media.tv.tuner.frontend.OnTuneEventListener; import android.media.tv.tuner.frontend.ScanCallback; import android.media.tv.tunerresourcemanager.ResourceClientProfile; +import android.media.tv.tunerresourcemanager.TunerFrontendRequest; import android.media.tv.tunerresourcemanager.TunerLnbRequest; import android.media.tv.tunerresourcemanager.TunerResourceManager; import android.os.Handler; @@ -195,15 +196,15 @@ public class Tuner implements AutoCloseable { private final TunerResourceManager mTunerResourceManager; private final int mClientId; - private List mFrontendIds; private Frontend mFrontend; private EventHandler mHandler; @Nullable private FrontendInfo mFrontendInfo; + private Integer mFrontendHandle; + private int mFrontendType = FrontendSettings.TYPE_UNDEFINED; - private List mLnbIds; private Lnb mLnb; - private Integer mLnbId; + private Integer mLnbHandle; @Nullable private OnTuneEventListener mOnTuneEventListener; @Nullable @@ -327,7 +328,7 @@ public class Tuner implements AutoCloseable { /** * Native method to open frontend of the given ID. */ - private native Frontend nativeOpenFrontendById(int id); + private native Frontend nativeOpenFrontendByHandle(int handle); private native int nativeTune(int type, FrontendSettings settings); private native int nativeStopTune(); private native int nativeScan(int settingsType, FrontendSettings settings, int scanType); @@ -344,7 +345,7 @@ public class Tuner implements AutoCloseable { private native TimeFilter nativeOpenTimeFilter(); private native List nativeGetLnbIds(); - private native Lnb nativeOpenLnbById(int id); + private native Lnb nativeOpenLnbByHandle(int handle); private native Lnb nativeOpenLnbByName(String name); private native Descrambler nativeOpenDescrambler(); @@ -476,7 +477,8 @@ public class Tuner implements AutoCloseable { @RequiresPermission(android.Manifest.permission.ACCESS_TV_TUNER) @Result public int tune(@NonNull FrontendSettings settings) { - TunerUtils.checkTunerPermission(mContext); + mFrontendType = settings.getType(); + checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND); mFrontendInfo = null; return nativeTune(settings.getType(), settings); } @@ -511,12 +513,13 @@ public class Tuner implements AutoCloseable { @Result public int scan(@NonNull FrontendSettings settings, @ScanType int scanType, @NonNull @CallbackExecutor Executor executor, @NonNull ScanCallback scanCallback) { - TunerUtils.checkTunerPermission(mContext); if (mScanCallback != null || mScanCallbackExecutor != null) { throw new IllegalStateException( "Scan already in progress. stopScan must be called before a new scan can be " + "started."); } + mFrontendType = settings.getType(); + checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND); mScanCallback = scanCallback; mScanCallbackExecutor = executor; mFrontendInfo = null; @@ -544,6 +547,16 @@ public class Tuner implements AutoCloseable { return retVal; } + private boolean requestFrontend() { + int[] feId = new int[1]; + TunerFrontendRequest request = new TunerFrontendRequest(mClientId, mFrontendType); + boolean granted = mTunerResourceManager.requestFrontend(request, feId); + if (granted) { + mFrontendHandle = feId[0]; + } + return granted; + } + /** * Sets Low-Noise Block downconverter (LNB) for satellite frontend. * @@ -677,22 +690,6 @@ public class Tuner implements AutoCloseable { return nativeGetDemuxCapabilities(); } - private List getFrontendIds() { - mFrontendIds = nativeGetFrontendIds(); - return mFrontendIds; - } - - private Frontend openFrontendById(int id) { - if (mFrontendIds == null) { - mFrontendIds = getFrontendIds(); - } - if (!mFrontendIds.contains(id)) { - return null; - } - mFrontend = nativeOpenFrontendById(id); - return mFrontend; - } - private void onFrontendEvent(int eventType) { if (mOnTunerEventExecutor != null && mOnTuneEventListener != null) { mOnTunerEventExecutor.execute(() -> mOnTuneEventListener.onTuneEvent(eventType)); @@ -829,11 +826,9 @@ public class Tuner implements AutoCloseable { public Lnb openLnb(@CallbackExecutor @NonNull Executor executor, @NonNull LnbCallback cb) { Objects.requireNonNull(executor, "executor must not be null"); Objects.requireNonNull(cb, "LnbCallback must not be null"); - TunerUtils.checkTunerPermission(mContext); - if (mLnbId == null && !requestLnb()) { - return null; - } - return nativeOpenLnbById(mLnbId); + checkResource(TunerResourceManager.TUNER_RESOURCE_TYPE_LNB); + // TODO: update JNI code for LNB handle, + return nativeOpenLnbByHandle(mLnbHandle); } /** @@ -861,7 +856,7 @@ public class Tuner implements AutoCloseable { TunerLnbRequest request = new TunerLnbRequest(mClientId); boolean granted = mTunerResourceManager.requestLnb(request, lnbId); if (granted) { - mLnbId = lnbId[0]; + mLnbHandle = lnbId[0]; } return granted; } @@ -876,22 +871,6 @@ public class Tuner implements AutoCloseable { return nativeOpenTimeFilter(); } - private List getLnbIds() { - mLnbIds = nativeGetLnbIds(); - return mLnbIds; - } - - private Lnb openLnbById(int id) { - if (mLnbIds == null) { - mLnbIds = getLnbIds(); - } - if (!mLnbIds.contains(id)) { - return null; - } - mLnb = nativeOpenLnbById(id); - return mLnb; - } - private void onLnbEvent(int eventType) { if (mHandler != null) { mHandler.sendMessage(mHandler.obtainMessage(MSG_ON_LNB_EVENT, eventType, 0)); @@ -955,4 +934,23 @@ public class Tuner implements AutoCloseable { DvrPlayback dvr = nativeOpenDvrPlayback(bufferSize); return dvr; } + + private boolean checkResource(int resourceType) { + // TODO: demux and descrambler + switch (resourceType) { + case TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND: { + if (mFrontendHandle == null && !requestFrontend()) { + return false; + } + break; + } + case TunerResourceManager.TUNER_RESOURCE_TYPE_LNB: { + if (mLnbHandle == null && !requestLnb()) { + return false; + } + break; + } + } + return true; + } } diff --git a/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java b/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java index 9dddcd4eaa3b6..63a71e272e536 100644 --- a/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java +++ b/media/java/android/media/tv/tunerresourcemanager/TunerResourceManager.java @@ -17,6 +17,7 @@ package android.media.tv.tunerresourcemanager; import android.annotation.CallbackExecutor; +import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresFeature; @@ -27,6 +28,8 @@ import android.os.Binder; import android.os.RemoteException; import android.util.Log; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.concurrent.Executor; /** @@ -61,6 +64,24 @@ public class TunerResourceManager { private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); public static final int INVALID_RESOURCE_HANDLE = -1; + /** + * 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; private final ITunerResourceManager mService; private final int mUserId; diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index a37c9e52f5dd9..bbeb45179c78f 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -1410,6 +1410,10 @@ static sp getDescrambler(JNIEnv *env, jobject descrambler) { return (IDescrambler *)env->GetLongField(descrambler, gFields.descramblerContext); } +static uint32_t getResourceIdFromHandle(jint handle) { + return (handle & 0x00ff0000) >> 16; +} + static DemuxPid getDemuxPid(int pidType, int pid) { DemuxPid demuxPid; if ((int)pidType == 1) { @@ -1968,8 +1972,10 @@ static jobject android_media_tv_Tuner_get_frontend_ids(JNIEnv *env, jobject thiz return tuner->getFrontendIds(); } -static jobject android_media_tv_Tuner_open_frontend_by_id(JNIEnv *env, jobject thiz, jint id) { +static jobject android_media_tv_Tuner_open_frontend_by_handle( + JNIEnv *env, jobject thiz, jint handle) { sp tuner = getTuner(env, thiz); + uint32_t id = getResourceIdFromHandle(handle); return tuner->openFrontendById(id); } @@ -2045,8 +2051,9 @@ static jobject android_media_tv_Tuner_get_lnb_ids(JNIEnv *env, jobject thiz) { return tuner->getLnbIds(); } -static jobject android_media_tv_Tuner_open_lnb_by_id(JNIEnv *env, jobject thiz, jint id) { +static jobject android_media_tv_Tuner_open_lnb_by_handle(JNIEnv *env, jobject thiz, jint handle) { sp tuner = getTuner(env, thiz); + uint32_t id = getResourceIdFromHandle(handle); return tuner->openLnbById(id); } @@ -2924,8 +2931,8 @@ static const JNINativeMethod gTunerMethods[] = { { "nativeSetup", "()V", (void *)android_media_tv_Tuner_native_setup }, { "nativeGetFrontendIds", "()Ljava/util/List;", (void *)android_media_tv_Tuner_get_frontend_ids }, - { "nativeOpenFrontendById", "(I)Landroid/media/tv/tuner/Tuner$Frontend;", - (void *)android_media_tv_Tuner_open_frontend_by_id }, + { "nativeOpenFrontendByHandle", "(I)Landroid/media/tv/tuner/Tuner$Frontend;", + (void *)android_media_tv_Tuner_open_frontend_by_handle }, { "nativeTune", "(ILandroid/media/tv/tuner/frontend/FrontendSettings;)I", (void *)android_media_tv_Tuner_tune }, { "nativeStopTune", "()I", (void *)android_media_tv_Tuner_stop_tune }, @@ -2950,8 +2957,8 @@ static const JNINativeMethod gTunerMethods[] = { (void *)android_media_tv_Tuner_open_time_filter }, { "nativeGetLnbIds", "()Ljava/util/List;", (void *)android_media_tv_Tuner_get_lnb_ids }, - { "nativeOpenLnbById", "(I)Landroid/media/tv/tuner/Lnb;", - (void *)android_media_tv_Tuner_open_lnb_by_id }, + { "nativeOpenLnbByHandle", "(I)Landroid/media/tv/tuner/Lnb;", + (void *)android_media_tv_Tuner_open_lnb_by_handle }, { "nativeOpenLnbByName", "(Ljava/lang/String;)Landroid/media/tv/tuner/Lnb;", (void *)android_media_tv_Tuner_open_lnb_by_name }, { "nativeOpenDescrambler", "()Landroid/media/tv/tuner/Descrambler;", 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 bd63b2daad838..25585b3ae7947 100644 --- a/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java +++ b/services/core/java/com/android/server/tv/tunerresourcemanager/TunerResourceManagerService.java @@ -16,7 +16,6 @@ package com.android.server.tv.tunerresourcemanager; -import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; @@ -41,8 +40,6 @@ 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; @@ -79,25 +76,6 @@ public class TunerResourceManagerService extends SystemService { // 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); } @@ -465,7 +443,7 @@ public class TunerResourceManagerService extends SystemService { // Grant frontend when there is unused resource. if (grantingFrontendId > -1) { frontendHandle[0] = generateResourceHandle( - TUNER_RESOURCE_TYPE_FRONTEND, grantingFrontendId); + TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND, grantingFrontendId); updateFrontendClientMappingOnNewGrant(grantingFrontendId, request.getClientId()); return true; } @@ -474,7 +452,7 @@ public class TunerResourceManagerService extends SystemService { // request client has higher priority. if (inUseLowestPriorityFrId > -1 && (requestClient.getPriority() > currentLowestPriority)) { frontendHandle[0] = generateResourceHandle( - TUNER_RESOURCE_TYPE_FRONTEND, inUseLowestPriorityFrId); + TunerResourceManager.TUNER_RESOURCE_TYPE_FRONTEND, inUseLowestPriorityFrId); reclaimFrontendResource(getFrontendResource( inUseLowestPriorityFrId).getOwnerClientId()); updateFrontendClientMappingOnNewGrant(inUseLowestPriorityFrId, request.getClientId()); @@ -489,7 +467,7 @@ public class TunerResourceManagerService extends SystemService { if (DEBUG) { Slog.d(TAG, "requestDemux(request=" + request + ")"); } - demuxHandle[0] = generateResourceHandle(TUNER_RESOURCE_TYPE_DEMUX, 0); + demuxHandle[0] = generateResourceHandle(TunerResourceManager.TUNER_RESOURCE_TYPE_DEMUX, 0); return true; } @@ -498,7 +476,8 @@ public class TunerResourceManagerService extends SystemService { if (DEBUG) { Slog.d(TAG, "requestDescrambler(request=" + request + ")"); } - descramblerHandle[0] = generateResourceHandle(TUNER_RESOURCE_TYPE_DESCRAMBLER, 0); + descramblerHandle[0] = + generateResourceHandle(TunerResourceManager.TUNER_RESOURCE_TYPE_DESCRAMBLER, 0); return true; } @@ -664,7 +643,8 @@ public class TunerResourceManagerService extends SystemService { return mClientProfiles.keySet().contains(clientId); } - private int generateResourceHandle(@TunerResourceType int resourceType, int resourceId) { + private int generateResourceHandle( + @TunerResourceManager.TunerResourceType int resourceType, int resourceId) { return (resourceType & 0x000000ff) << 24 | (resourceId << 16) | (mResourceRequestCount++ & 0xffff);