aboutsummaryrefslogtreecommitdiff
path: root/src/com/android/tv/Features.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/tv/Features.java')
-rw-r--r--src/com/android/tv/Features.java151
1 files changed, 121 insertions, 30 deletions
diff --git a/src/com/android/tv/Features.java b/src/com/android/tv/Features.java
index 7e8e3689..2052f2e7 100644
--- a/src/com/android/tv/Features.java
+++ b/src/com/android/tv/Features.java
@@ -16,22 +16,29 @@
package com.android.tv;
-import static com.android.tv.common.feature.EngOnlyFeature.ENG_ONLY_FEATURE;
-import static com.android.tv.common.feature.FeatureUtils.AND;
-import static com.android.tv.common.feature.FeatureUtils.OFF;
-import static com.android.tv.common.feature.FeatureUtils.ON;
-import static com.android.tv.common.feature.FeatureUtils.OR;
-
import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.annotation.VisibleForTesting;
-import android.support.v4.os.BuildCompat;
+import android.text.TextUtils;
+import android.util.Log;
import com.android.tv.common.feature.Feature;
import com.android.tv.common.feature.GServiceFeature;
import com.android.tv.common.feature.PropertyFeature;
+import com.android.tv.config.RemoteConfig;
+import com.android.tv.experiments.Experiments;
+import com.android.tv.util.LocationUtils;
import com.android.tv.util.PermissionUtils;
+import com.android.tv.util.Utils;
+
+import java.util.Locale;
+
+import static com.android.tv.common.feature.EngOnlyFeature.ENG_ONLY_FEATURE;
+import static com.android.tv.common.feature.FeatureUtils.AND;
+import static com.android.tv.common.feature.FeatureUtils.OFF;
+import static com.android.tv.common.feature.FeatureUtils.ON;
+import static com.android.tv.common.feature.FeatureUtils.OR;
/**
* List of {@link Feature} for the Live TV App.
@@ -39,6 +46,9 @@ import com.android.tv.util.PermissionUtils;
* <p>Remove the {@code Feature} once it is launched.
*/
public final class Features {
+ private static final String TAG = "Features";
+ private static final boolean DEBUG = false;
+
/**
* UI for opting in to analytics.
*
@@ -57,17 +67,40 @@ public final class Features {
public static final Feature EPG_SEARCH =
new PropertyFeature("feature_tv_use_epg_search", false);
- public static final Feature TUNER = new Feature() {
- @Override
- public boolean isEnabled(Context context) {
+ public static final Feature TUNER =
+ new Feature() {
+ @Override
+ public boolean isEnabled(Context context) {
- // This is special handling just for USB Tuner.
- // It does not require any N API's but relies on a improvements in N for AC3 support
- // After release, change class to this to just be {@link BuildCompat#isAtLeastN()}.
- return Build.VERSION.SDK_INT > Build.VERSION_CODES.M || BuildCompat.isAtLeastN();
- }
+ if (Utils.isDeveloper()) {
+ // we enable tuner for developers to test tuner in any platform.
+ return true;
+ }
- };
+ // This is special handling just for USB Tuner.
+ // It does not require any N API's but relies on a improvements in N for AC3 support
+ return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N;
+ }
+ };
+
+ /**
+ * Use network tuner if it is available and there is no other tuner types.
+ */
+ public static final Feature NETWORK_TUNER =
+ new Feature() {
+ @Override
+ public boolean isEnabled(Context context) {
+ if (!TUNER.isEnabled(context)) {
+ return false;
+ }
+ if (Utils.isDeveloper()) {
+ // Network tuner will be enabled for developers.
+ return true;
+ }
+ return Locale.US.getCountry().equalsIgnoreCase(
+ LocationUtils.getCurrentCountry(context));
+ }
+ };
private static final String GSERVICE_KEY_UNHIDE = "live_channels_unhide";
/**
@@ -82,22 +115,75 @@ public final class Features {
}
});
- public static final Feature PICTURE_IN_PICTURE = new Feature() {
- private Boolean mEnabled;
+ public static final Feature PICTURE_IN_PICTURE =
+ new Feature() {
+ private Boolean mEnabled;
- @Override
- public boolean isEnabled(Context context) {
- if (mEnabled == null) {
- mEnabled = context.getPackageManager().hasSystemFeature(
- PackageManager.FEATURE_PICTURE_IN_PICTURE);
- }
- return mEnabled;
- }
- };
+ @Override
+ public boolean isEnabled(Context context) {
+ if (mEnabled == null) {
+ mEnabled =
+ Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
+ && context.getPackageManager()
+ .hasSystemFeature(
+ PackageManager.FEATURE_PICTURE_IN_PICTURE);
+ }
+ return mEnabled;
+ }
+ };
- /**
- * Enable a conflict dialog between currently watched channel and upcoming recording.
- */
+ /** Use AC3 software decode. */
+ public static final Feature AC3_SOFTWARE_DECODE =
+ new Feature() {
+ private final String[] SUPPORTED_REGIONS = {};
+
+ private Boolean mEnabled;
+
+ @Override
+ public boolean isEnabled(Context context) {
+ if (mEnabled == null) {
+ if (mEnabled == null) {
+ // We will not cache the result of fallback solution.
+ String country = LocationUtils.getCurrentCountry(context);
+ for (int i = 0; i < SUPPORTED_REGIONS.length; ++i) {
+ if (SUPPORTED_REGIONS[i].equalsIgnoreCase(country)) {
+ return true;
+ }
+ }
+ if (DEBUG) Log.d(TAG, "AC3 flag false after country check");
+ return false;
+ }
+ }
+ if (DEBUG) Log.d(TAG, "AC3 flag " + mEnabled);
+ return mEnabled;
+ }
+ };
+
+ /** Show postal code fragment before channel scan. */
+ public static final Feature ENABLE_CLOUD_EPG_REGION =
+ new Feature() {
+ private final String[] SUPPORTED_REGIONS = {
+ };
+
+
+ @Override
+ public boolean isEnabled(Context context) {
+ if (!Experiments.CLOUD_EPG.get()) {
+ if (DEBUG) Log.d(TAG, "Experiments.CLOUD_EPG is false");
+ return false;
+ }
+ String country = LocationUtils.getCurrentCountry(context);
+ for (int i = 0; i < SUPPORTED_REGIONS.length; i++) {
+ if (SUPPORTED_REGIONS[i].equalsIgnoreCase(country)) {
+ return true;
+ }
+ }
+ if (DEBUG) Log.d(TAG, "EPG flag false after country check");
+ return false;
+ }
+ };
+
+ /** Enable a conflict dialog between currently watched channel and upcoming recording. */
public static final Feature SHOW_UPCOMING_CONFLICT_DIALOG = OFF;
/**
@@ -105,6 +191,11 @@ public final class Features {
*/
public static final Feature USE_PARTNER_INPUT_BLACKLIST = ON;
+ /**
+ * Enable Dvb parsers and listeners.
+ */
+ public static final Feature ENABLE_FILE_DVB = OFF;
+
@VisibleForTesting
public static final Feature TEST_FEATURE = new PropertyFeature("test_feature", false);