summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2024-05-17 20:36:07 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2024-05-17 20:36:07 +0000
commitb1e862b913ebed729893c471d64fdc7a1e9b8603 (patch)
treea3e1c4c3d3aa5dc020c6ed2ac6e466ad8049e3a4
parent2e2a52b4d0e0c10e75c7ab037448395b9199c358 (diff)
parentd54858e3ef78cdf30f7a6a2c3eb2a800c81bf5fc (diff)
downloadcts-android14-tests-release.tar.gz
Merge "Snap for 11858029 from 6ccb9739db74be2e3ecd23f9b5af99e8fdd25c0f to android14-tests-release" into android14-tests-releaseandroid14-tests-release
-rw-r--r--tests/devicepolicy/src/android/devicepolicy/cts/BluetoothTest.java12
-rw-r--r--tests/tests/media/audio/src/android/media/audio/cts/AudioPlaybackConfigurationTest.java15
-rw-r--r--tests/tests/tv/src/android/media/tv/tuner/cts/TunerResourceTestService.java3
-rw-r--r--tests/tests/tv/src/android/media/tv/tuner/cts/TunerTest.java198
4 files changed, 141 insertions, 87 deletions
diff --git a/tests/devicepolicy/src/android/devicepolicy/cts/BluetoothTest.java b/tests/devicepolicy/src/android/devicepolicy/cts/BluetoothTest.java
index f4ebef323be..122b3575026 100644
--- a/tests/devicepolicy/src/android/devicepolicy/cts/BluetoothTest.java
+++ b/tests/devicepolicy/src/android/devicepolicy/cts/BluetoothTest.java
@@ -407,6 +407,8 @@ public final class BluetoothTest {
@Postsubmit(reason = "new test")
@ApiTest(apis = "android.os.UserManager#DISALLOW_BLUETOOTH_SHARING")
public void share_disallowBluetoothAndSharingRestrictionsAreNotSet_canShare() {
+ Assume.assumeTrue("We can't test resolving if opp is disabled", OPP_ENABLED);
+
Poll.forValue("Opp Launcher Component Enabled",
() -> TestApis.packages().activity(OPP_LAUNCHER_COMPONENT)
.isEnabled(TestApis.users().system()))
@@ -414,8 +416,6 @@ public final class BluetoothTest {
.errorOnFail()
.await();
- Assume.assumeTrue("We can't test resolving if opp is disabled", OPP_ENABLED);
-
List<ResolveInfo> resolveInfos = sPackageManager.queryIntentActivities(
FILE_SHARING_INTENT, /* flags= */ 0);
assertThat(resolveInfosContainsActivity(resolveInfos, OPP_LAUNCHER_COMPONENT)).isTrue();
@@ -426,6 +426,8 @@ public final class BluetoothTest {
@Postsubmit(reason = "new test")
@ApiTest(apis = "android.os.UserManager#DISALLOW_BLUETOOTH_SHARING")
public void share_disallowBluetoothSharingRestrictionIsSet_canNotShare() {
+ Assume.assumeTrue("We can't test resolving if opp is disabled", OPP_ENABLED);
+
Poll.forValue("Opp Launcher Component Enabled",
() -> TestApis.packages().activity(OPP_LAUNCHER_COMPONENT)
.isEnabled(TestApis.users().system()))
@@ -433,8 +435,6 @@ public final class BluetoothTest {
.errorOnFail()
.await();
- Assume.assumeTrue("We can't test resolving if opp is disabled", OPP_ENABLED);
-
List<ResolveInfo> resolveInfos = sPackageManager.queryIntentActivities(
FILE_SHARING_INTENT, /* flags= */ 0);
assertThat(resolveInfosContainsActivity(resolveInfos, OPP_LAUNCHER_COMPONENT)).isFalse();
@@ -483,6 +483,8 @@ public final class BluetoothTest {
@ApiTest(apis = "android.os.UserManager#DISALLOW_BLUETOOTH")
@RequireNotHeadlessSystemUserMode(reason = "b/276405672 bluetooth restriction not enforced on secondary users")
public void share_disallowBluetoothRestrictionIsSet_canNotShare() {
+ Assume.assumeTrue("We can't test resolving if opp is disabled", OPP_ENABLED);
+
Poll.forValue("Opp Launcher Component Enabled",
() -> TestApis.packages().activity(OPP_LAUNCHER_COMPONENT)
.isEnabled(TestApis.users().system()))
@@ -490,8 +492,6 @@ public final class BluetoothTest {
.errorOnFail()
.await();
- Assume.assumeTrue("We can't test resolving if opp is disabled", OPP_ENABLED);
-
List<ResolveInfo> resolveInfos = sPackageManager.queryIntentActivities(
FILE_SHARING_INTENT, /* flags= */ 0);
assertThat(resolveInfosContainsActivity(resolveInfos, OPP_LAUNCHER_COMPONENT)).isFalse();
diff --git a/tests/tests/media/audio/src/android/media/audio/cts/AudioPlaybackConfigurationTest.java b/tests/tests/media/audio/src/android/media/audio/cts/AudioPlaybackConfigurationTest.java
index 0c5e0895679..9a7b3bc65f0 100644
--- a/tests/tests/media/audio/src/android/media/audio/cts/AudioPlaybackConfigurationTest.java
+++ b/tests/tests/media/audio/src/android/media/audio/cts/AudioPlaybackConfigurationTest.java
@@ -493,6 +493,10 @@ public class AudioPlaybackConfigurationTest extends CtsAndroidTestCase {
"android.media.AudioManager.AudioPlaybackCallback#isMuted",
"android.media.AudioManager.AudioPlaybackCallback#getMutedBy"})
public void testAudioTrackMuteFromAppOpsNotification() throws Exception {
+ if (isWatch()) {
+ Log.w(TAG, "Skip testAudioTrackMuteFromAppOpsNotification for Wear");
+ return;
+ }
if (!isValidPlatform("testAudioTrackMuteFromAppOpsNotification")) return;
if (hasAudioSilentProperty()) {
Log.w(TAG, "Device has ro.audio.silent set, skipping "
@@ -509,6 +513,10 @@ public class AudioPlaybackConfigurationTest extends CtsAndroidTestCase {
"android.media.AudioManager.AudioPlaybackCallback#isMuted",
"android.media.AudioManager.AudioPlaybackCallback#getMutedBy"})
public void testMediaPlayerMuteFromAppOpsNotification() throws Exception {
+ if (isWatch()) {
+ Log.w(TAG, "Skip testMediaPlayerMuteFromAppOpsNotification for Wear");
+ return;
+ }
if (!isValidPlatform("testMediaPlayerMuteFromAppOpsNotification")) return;
if (hasAudioSilentProperty()) {
Log.w(TAG, "Device has ro.audio.silent set, skipping "
@@ -700,6 +708,9 @@ public class AudioPlaybackConfigurationTest extends CtsAndroidTestCase {
assertTrue("onPlaybackConfigChanged play, format and device expected",
callback.waitForCallbacks(3,
TEST_TIMING_TOLERANCE_MS + PLAY_ROUTING_TIMING_TOLERANCE_MS));
+ if (mAt != null) {
+ Thread.sleep(TEST_TIMING_TOLERANCE_MS + PLAY_ROUTING_TIMING_TOLERANCE_MS);
+ }
} else {
Thread.sleep(TEST_TIMING_TOLERANCE_MS + PLAY_ROUTING_TIMING_TOLERANCE_MS);
}
@@ -1022,4 +1033,8 @@ public class AudioPlaybackConfigurationTest extends CtsAndroidTestCase {
}
return true;
}
+
+ private boolean isWatch() {
+ return getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_WATCH);
+ }
}
diff --git a/tests/tests/tv/src/android/media/tv/tuner/cts/TunerResourceTestService.java b/tests/tests/tv/src/android/media/tv/tuner/cts/TunerResourceTestService.java
index e7145088bb3..93cdf000e15 100644
--- a/tests/tests/tv/src/android/media/tv/tuner/cts/TunerResourceTestService.java
+++ b/tests/tests/tv/src/android/media/tv/tuner/cts/TunerResourceTestService.java
@@ -69,6 +69,9 @@ public class TunerResourceTestService extends Service {
mFeInfo = infos.get(frontendIndex);
mFeSettings = TunerTest.createFrontendSettings(mFeInfo);
+ // apply target frontend only, for case when there are multiple instances in frontend type
+ mTuner.applyFrontend(mFeInfo);
+
// tune
return mTuner.tune(mFeSettings);
}
diff --git a/tests/tests/tv/src/android/media/tv/tuner/cts/TunerTest.java b/tests/tests/tv/src/android/media/tv/tuner/cts/TunerTest.java
index 6a4ab4ec3a5..0d07786977f 100644
--- a/tests/tests/tv/src/android/media/tv/tuner/cts/TunerTest.java
+++ b/tests/tests/tv/src/android/media/tv/tuner/cts/TunerTest.java
@@ -24,6 +24,7 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.junit.Assume.assumeNotNull;
+import static org.junit.Assume.assumeTrue;
import android.content.ComponentName;
import android.content.Context;
@@ -1111,7 +1112,8 @@ public class TunerTest {
return;
}
- assertEquals(lnb.setVoltage(Lnb.VOLTAGE_5V), Tuner.RESULT_SUCCESS);
+ int targetLnbVoltage = getTargetLnbVoltage();
+ assertEquals(lnb.setVoltage(targetLnbVoltage), Tuner.RESULT_SUCCESS);
assertEquals(lnb.setTone(Lnb.TONE_NONE), Tuner.RESULT_SUCCESS);
assertEquals(
lnb.setSatellitePosition(Lnb.POSITION_A), Tuner.RESULT_SUCCESS);
@@ -1662,17 +1664,17 @@ public class TunerTest {
assertFalse(ids.isEmpty());
int targetFrontendId = sTunerCtsConfiguration.getTargetFrontendId().intValueExact();
FrontendInfo info = mTuner.getFrontendInfoById(ids.get(targetFrontendId));
- FrontendSettings feSettings = createFrontendSettings(info);
- // first tune with mTuner to acquire resource
- int res = mTuner.tune(feSettings);
+ // first apply frontend with mTuner to acquire resource
+ int res = mTuner.applyFrontend(info);
assertEquals(Tuner.RESULT_SUCCESS, res);
assertNotNull(mTuner.getFrontendInfo());
- // now tune with a higher priority tuner to have mTuner's resource reclaimed
+ // now apply frontend with a higher priority tuner to have mTuner's resource reclaimed
Tuner higherPrioTuner = new Tuner(mContext, null, 200);
- res = higherPrioTuner.tune(feSettings);
+ res = higherPrioTuner.applyFrontend(info);
assertEquals(Tuner.RESULT_SUCCESS, res);
+
assertNotNull(higherPrioTuner.getFrontendInfo());
higherPrioTuner.close();
@@ -1688,8 +1690,8 @@ public class TunerTest {
FrontendInfo info = mTuner.getFrontendInfoById(ids.get(targetFrontendId));
FrontendSettings feSettings = createFrontendSettings(info);
- // first tune with mTuner to acquire resource
- int res = mTuner.tune(feSettings);
+ // first apply frontend with mTuner to acquire resource
+ int res = mTuner.applyFrontend(info);
assertEquals(Tuner.RESULT_SUCCESS, res);
assertNotNull(mTuner.getFrontendInfo());
@@ -1749,9 +1751,11 @@ public class TunerTest {
tunerResourceTestServer = connection.getService();
// CASE1 - normal reclaim
- //
- // first tune with mTuner to acquire resource
- int res = mTuner.tune(feSettings);
+
+ // first apply frontend with mTuner to acquire resource
+ int res = mTuner.applyFrontend(info);
+ assertEquals(Tuner.RESULT_SUCCESS, res);
+
boolean tunerReclaimed = false;
assertEquals(Tuner.RESULT_SUCCESS, res);
assertNotNull(mTuner.getFrontendInfo());
@@ -1827,27 +1831,27 @@ public class TunerTest {
@Test
public void testShareFrontendFromTuner() throws Exception {
- Tuner tuner100 = new Tuner(mContext, null, 100);
- List<Integer> ids = tuner100.getFrontendIds();
+ List<Integer> ids = mTuner.getFrontendIds();
assumeNotNull(ids);
assertFalse(ids.isEmpty());
int targetFrontendId = sTunerCtsConfiguration.getTargetFrontendId().intValueExact();
- FrontendInfo info = tuner100.getFrontendInfoById(ids.get(targetFrontendId));
+ FrontendInfo info = mTuner.getFrontendInfoById(ids.get(targetFrontendId));
FrontendSettings feSettings = createFrontendSettings(info);
+
int[] statusTypes = {1};
- boolean exceptionThrown = false;
- int res;
+ boolean exceptionThrown;
- // CASE1: check resource reclaim while sharee's priority < owner's priority
- // let tuner100 share from tuner200
+ Tuner tuner100 = new Tuner(mContext, null, 100);
Tuner tuner200 = new Tuner(mContext, null, 200);
- res = tuner200.tune(feSettings);
- assertEquals(Tuner.RESULT_SUCCESS, res);
+ Tuner tuner300 = new Tuner(mContext, null, 300);
- info = tuner200.getFrontendInfoById(ids.get(targetFrontendId));
- res = tuner200.tune(feSettings);
+ // CASE1: check resource reclaim while sharee's priority < owner's priority
+
+ // apply target frontend only, for case when there are multiple instances in frontend type
+ int res = tuner200.applyFrontend(info);
assertEquals(Tuner.RESULT_SUCCESS, res);
+ // let tuner100 share from tuner200
tuner100.shareFrontendFromTuner(tuner200);
// call openFilter to trigger ITunerDemux.setFrontendDataSourceById()
Filter f = tuner100.openFilter(
@@ -1859,7 +1863,6 @@ public class TunerTest {
TunerTestOnTuneEventListener cb200 = new TunerTestOnTuneEventListener();
// tune again on the owner
- info = tuner200.getFrontendInfoById(ids.get(1));
tuner100.setOnTuneEventListener(getExecutor(), cb100);
tuner200.setOnTuneEventListener(getExecutor(), cb200);
res = tuner200.tune(feSettings);
@@ -1870,8 +1873,7 @@ public class TunerTest {
tuner200.clearOnTuneEventListener();
// now let the higher priority tuner steal the resource
- Tuner tuner300 = new Tuner(mContext, null, 300);
- res = tuner300.tune(feSettings);
+ res = tuner300.applyFrontend(info);
assertEquals(Tuner.RESULT_SUCCESS, res);
// confirm owner & sharee's resource gets reclaimed by confirming an exception is thrown
@@ -1898,7 +1900,9 @@ public class TunerTest {
// CASE2: check resource reclaim fail when sharee's priority > new requester
tuner100 = new Tuner(mContext, null, 100);
- res = tuner100.tune(feSettings);
+
+ // apply target frontend only, for case when there are multiple instances in frontend type
+ res = tuner100.applyFrontend(info);
assertEquals(Tuner.RESULT_SUCCESS, res);
tuner300 = new Tuner(mContext, null, 300);
@@ -1908,7 +1912,9 @@ public class TunerTest {
assertNotNull(f);
tuner200 = new Tuner(mContext, null, 200);
- res = tuner200.tune(feSettings);
+
+ // apply target frontend only, for case when there are multiple instances in frontend type
+ res = tuner200.applyFrontend(info);
assertNotEquals(Tuner.RESULT_SUCCESS, res);
// confirm the original tuner is still intact
@@ -1926,13 +1932,15 @@ public class TunerTest {
assertFalse(ids.isEmpty());
int targetFrontendId = sTunerCtsConfiguration.getTargetFrontendId().intValueExact();
FrontendInfo info = mTuner.getFrontendInfoById(ids.get(targetFrontendId));
- FrontendSettings feSettings = createFrontendSettings(info);
+ createFrontendSettings(info);
// SCENARIO 1 - transfer and close the previous owner
- // First create a tuner and tune() to acquire frontend resource
+ // First create a tuner and applyFrontend() to acquire frontend resource
Tuner tunerA = new Tuner(mContext, null, 100);
- int res = tunerA.tune(feSettings);
+
+ // apply target frontend only, for case when there are multiple instances in frontend type
+ int res = tunerA.applyFrontend(info);
assertEquals(Tuner.RESULT_SUCCESS, res);
// Create another tuner and share frontend from tunerA
@@ -1962,9 +1970,11 @@ public class TunerTest {
// SCENARIO 2 - transfer and closeFrontend and tune on the previous owner
- // First create a tuner and tune() to acquire frontend resource
+ // First create a tuner and applyFrontend() to acquire frontend resource
tunerA = new Tuner(mContext, null, 200);
- res = tunerA.tune(feSettings);
+
+ // apply target frontend only, for case when there are multiple instances in frontend type
+ res = tunerA.applyFrontend(info);
assertEquals(Tuner.RESULT_SUCCESS, res);
// Create another tuner and share frontend from tunerA
@@ -1981,7 +1991,9 @@ public class TunerTest {
// Confirm tune works without going through Tuner.close() even after transferOwner()
// The purpose isn't to get tunerB's frontend revoked, but doing so as singletuner
// based test has wider coverage
- res = tunerA.tune(feSettings); // this should reclaim tunerB
+
+ // apply target frontend only, for case when there are multiple instances in frontend type
+ res = tunerA.applyFrontend(info);
assertEquals(Tuner.RESULT_SUCCESS, res);
// Confirm tuberB is revoked
@@ -2071,8 +2083,9 @@ public class TunerTest {
// Open Lnb and check the callback
TunerTestLnbCallback lnbCB1 = new TunerTestLnbCallback();
Lnb lnbA = tunerA.openLnb(getExecutor(), lnbCB1);
- assertNotNull(lnbA);
- lnbA.setVoltage(Lnb.VOLTAGE_5V);
+ assumeTrue(lnbA != null);
+ int targetLnbVoltage = getTargetLnbVoltage();
+ lnbA.setVoltage(targetLnbVoltage);
lnbA.setTone(Lnb.TONE_CONTINUOUS);
lnbA.sendDiseqcMessage(new byte[] {1, 2});
assertTrue(lnbCB1.getOnDiseqcMessageCalled());
@@ -2937,29 +2950,33 @@ public class TunerTest {
int type = mTuner.getFrontendInfoById(ids.get(i)).getType();
if (TunerVersionChecker.isHigherOrEqualVersionTo(
TunerVersionChecker.TUNER_VERSION_2_0)) {
- int defaultMax = -1;
+ int defaultMax = mTuner.getMaxNumberOfFrontends(type);
int status;
- // Check default value
- defaultMax = mTuner.getMaxNumberOfFrontends(type);
- assertTrue(defaultMax > 0);
- // Set to -1
- status = mTuner.setMaxNumberOfFrontends(type, -1);
- assertEquals(Tuner.RESULT_INVALID_ARGUMENT, status);
- // Set to defaultMax + 1
- status = mTuner.setMaxNumberOfFrontends(type, defaultMax + 1);
- assertEquals(Tuner.RESULT_INVALID_ARGUMENT, status);
- // Set to 0
- status = mTuner.setMaxNumberOfFrontends(type, 0);
- assertEquals(Tuner.RESULT_SUCCESS, status);
- // Check after set
- int currentMax = -1;
- currentMax = mTuner.getMaxNumberOfFrontends(type);
- assertEquals(currentMax, 0);
- // Reset to default
- status = mTuner.setMaxNumberOfFrontends(type, defaultMax);
- assertEquals(Tuner.RESULT_SUCCESS, status);
- currentMax = mTuner.getMaxNumberOfFrontends(type);
- assertEquals(defaultMax, currentMax);
+ // Use try block to ensure restoring the max Tuner
+ try {
+ // Check default value
+ assertTrue(defaultMax > 0);
+ // Set to -1
+ status = mTuner.setMaxNumberOfFrontends(type, -1);
+ assertEquals(Tuner.RESULT_INVALID_ARGUMENT, status);
+ // Set to defaultMax + 1
+ status = mTuner.setMaxNumberOfFrontends(type, defaultMax + 1);
+ assertEquals(Tuner.RESULT_INVALID_ARGUMENT, status);
+ // Set to 0
+ status = mTuner.setMaxNumberOfFrontends(type, 0);
+ assertEquals(Tuner.RESULT_SUCCESS, status);
+ // Check after set
+ int currentMax = mTuner.getMaxNumberOfFrontends(type);
+ assertEquals(currentMax, 0);
+ } catch (Exception e) {
+ throw (e);
+ } finally {
+ // Reset to default
+ status = mTuner.setMaxNumberOfFrontends(type, defaultMax);
+ assertEquals(Tuner.RESULT_SUCCESS, status);
+ int currentMax = mTuner.getMaxNumberOfFrontends(type);
+ assertEquals(defaultMax, currentMax);
+ }
} else {
int defaultMax = mTuner.getMaxNumberOfFrontends(type);
assertEquals(defaultMax, -1);
@@ -2979,45 +2996,64 @@ public class TunerTest {
assertEquals(Tuner.RESULT_SUCCESS, mTuner.tune(feSettings1));
assertNotNull(mTuner.getFrontendInfo());
- // validate that set max cannot be set to lower value than current usage
- assertEquals(Tuner.RESULT_INVALID_ARGUMENT,
+ // Use try block to ensure restoring the max Tuner
+ try {
+ // validate that set max cannot be set to lower value than current usage
+ assertEquals(Tuner.RESULT_INVALID_ARGUMENT,
mTuner.setMaxNumberOfFrontends(type1, 0));
- // validate max value is reflected in the tune behavior
- mTuner.closeFrontend();
- assertEquals(Tuner.RESULT_SUCCESS,
+ // validate max value is reflected in the tune behavior
+ mTuner.closeFrontend();
+ assertEquals(Tuner.RESULT_SUCCESS,
mTuner.setMaxNumberOfFrontends(type1, 0));
- assertEquals(Tuner.RESULT_UNAVAILABLE,
+ assertEquals(Tuner.RESULT_UNAVAILABLE,
mTuner.tune(feSettings1));
- assertEquals(Tuner.RESULT_SUCCESS,
+ assertEquals(Tuner.RESULT_SUCCESS,
mTuner.setMaxNumberOfFrontends(type1, originalMax1));
- assertEquals(Tuner.RESULT_SUCCESS, mTuner.tune(feSettings1));
- assertNotNull(mTuner.getFrontendInfo());
- mTuner.closeFrontend();
+ assertEquals(Tuner.RESULT_SUCCESS, mTuner.tune(feSettings1));
+ assertNotNull(mTuner.getFrontendInfo());
+ mTuner.closeFrontend();
+ } catch (Exception e) {
+ throw(e);
+ } finally {
+ assertEquals(Tuner.RESULT_SUCCESS,
+ mTuner.setMaxNumberOfFrontends(type1, originalMax1));
+ }
}
// validate max number on one frontend type has no impact on other
if (ids.size() >= 2) {
- FrontendInfo info2 = mTuner.getFrontendInfoById(ids.get(1));
- int type2 = info2.getType();
- int originalMax2 = mTuner.getMaxNumberOfFrontends(type2);
-
- assertEquals(Tuner.RESULT_SUCCESS,
- mTuner.setMaxNumberOfFrontends(type2, 0));
- assertEquals(Tuner.RESULT_SUCCESS,
- mTuner.tune(feSettings1));
- assertNotNull(mTuner.getFrontendInfo());
-
- // set it back to the original max
- assertEquals(Tuner.RESULT_SUCCESS,
- mTuner.setMaxNumberOfFrontends(type2, originalMax2));
- mTuner.closeFrontend();
+ int type2 = type1;
+ for (int i = 0; i < ids.size(); i++) {
+ FrontendInfo info2 = mTuner.getFrontendInfoById(ids.get(i));
+ type2 = info2.getType();
+ if (type1 != type2) break;
+ }
+ if (type1 != type2) {
+ int originalMax2 = mTuner.getMaxNumberOfFrontends(type2);
+ // Use try block to ensure restoring the max Tuner
+ try {
+ assertEquals(Tuner.RESULT_SUCCESS,
+ mTuner.setMaxNumberOfFrontends(type2, 0));
+ assertEquals(Tuner.RESULT_SUCCESS,
+ mTuner.tune(feSettings1));
+ assertNotNull(mTuner.getFrontendInfo());
+ mTuner.closeFrontend();
+ } catch (Exception e) {
+ throw (e);
+ } finally {
+ // set it back to the original max
+ assertEquals(Tuner.RESULT_SUCCESS,
+ mTuner.setMaxNumberOfFrontends(type2, originalMax2));
+ }
+ }
}
}
}
+
public static Filter createTsSectionFilter(
Tuner tuner, Executor e, FilterCallback cb) {
Filter f = tuner.openFilter(Filter.TYPE_TS, Filter.SUBTYPE_SECTION, 1000, e, cb);