diff --git a/api/system-current.txt b/api/system-current.txt index 9f8967b92bd7d..2796f8d8edfdd 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5092,6 +5092,7 @@ package android.media.tv.tuner { method public long getAvSyncTime(int); method @Nullable public android.media.tv.tuner.DemuxCapabilities getDemuxCapabilities(); method @Nullable public android.media.tv.tuner.frontend.FrontendInfo getFrontendInfo(); + method @Nullable public java.util.List getFrontendInfoList(); method @Nullable public android.media.tv.tuner.frontend.FrontendStatus getFrontendStatus(@NonNull int[]); method public int linkFrontendToCiCam(int); method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_TV_DESCRAMBLER) public android.media.tv.tuner.Descrambler openDescrambler(); diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 9490fbf78d84e..bbe0742e31cb5 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -5032,6 +5032,7 @@ package android.media.tv.tuner { method public long getAvSyncTime(int); method @Nullable public android.media.tv.tuner.DemuxCapabilities getDemuxCapabilities(); method @Nullable public android.media.tv.tuner.frontend.FrontendInfo getFrontendInfo(); + method @Nullable public java.util.List getFrontendInfoList(); method @Nullable public android.media.tv.tuner.frontend.FrontendStatus getFrontendStatus(@NonNull int[]); method public int linkFrontendToCiCam(int); method @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_TV_DESCRAMBLER) public android.media.tv.tuner.Descrambler openDescrambler(); diff --git a/media/java/android/media/tv/tuner/Tuner.java b/media/java/android/media/tv/tuner/Tuner.java index aa3143fafd88d..97161e563dadc 100644 --- a/media/java/android/media/tv/tuner/Tuner.java +++ b/media/java/android/media/tv/tuner/Tuner.java @@ -61,6 +61,7 @@ import com.android.internal.util.FrameworkStatsLog; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -369,6 +370,28 @@ public class Tuner implements AutoCloseable { mTunerResourceManager.setFrontendInfoList(infos); } + /** + * Get frontend info list from native and build them into a {@link FrontendInfo} list. Any + * {@code null} FrontendInfo element would be removed. + */ + private FrontendInfo[] getFrontendInfoListInternal() { + List ids = getFrontendIds(); + if (ids == null) { + return null; + } + FrontendInfo[] infos = new FrontendInfo[ids.size()]; + for (int i = 0; i < ids.size(); i++) { + int id = ids.get(i); + FrontendInfo frontendInfo = getFrontendInfoById(id); + if (frontendInfo == null) { + Log.e(TAG, "Failed to get a FrontendInfo on frontend id:" + id + "!"); + continue; + } + infos[i] = frontendInfo; + } + return Arrays.stream(infos).filter(Objects::nonNull).toArray(FrontendInfo[]::new); + } + /** @hide */ public static int getTunerVersion() { return sTunerVersion; @@ -932,7 +955,7 @@ public class Tuner implements AutoCloseable { } /** - * Gets the frontend information. + * Gets the initialized frontend information. * * @return The frontend information. {@code null} if the operation failed. */ @@ -950,6 +973,16 @@ public class Tuner implements AutoCloseable { return mFrontendInfo; } + /** + * Get a list all the existed frontend information. + * + * @return The list of all the frontend information. {@code null} if the operation failed. + */ + @Nullable + public List getFrontendInfoList() { + return Arrays.asList(getFrontendInfoListInternal()); + } + /** @hide */ public FrontendInfo getFrontendInfoById(int id) { return nativeGetFrontendInfo(id); diff --git a/media/java/android/media/tv/tuner/frontend/FrontendInfo.java b/media/java/android/media/tv/tuner/frontend/FrontendInfo.java index 68c0c9659cb9e..f3e94760c847d 100644 --- a/media/java/android/media/tv/tuner/frontend/FrontendInfo.java +++ b/media/java/android/media/tv/tuner/frontend/FrontendInfo.java @@ -22,6 +22,9 @@ import android.media.tv.tuner.frontend.FrontendSettings.Type; import android.media.tv.tuner.frontend.FrontendStatus.FrontendStatusType; import android.util.Range; +import java.util.Arrays; +import java.util.Objects; + /** * This class is used to specify meta information of a frontend. * @@ -118,4 +121,30 @@ public class FrontendInfo { public FrontendCapabilities getFrontendCapabilities() { return mFrontendCap; } + + + /** @hide */ + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || !(o instanceof FrontendInfo)) { + return false; + } + // TODO: compare FrontendCapabilities + FrontendInfo info = (FrontendInfo) o; + return mId == info.getId() && mType == info.getType() + && Objects.equals(mFrequencyRange, info.getFrequencyRange()) + && Objects.equals(mSymbolRateRange, info.getSymbolRateRange()) + && mAcquireRange == info.getAcquireRange() + && mExclusiveGroupId == info.getExclusiveGroupId() + && Arrays.equals(mStatusCaps, info.getStatusCapabilities()); + } + + /** @hide */ + @Override + public int hashCode() { + return mId; + } }