Turn off cloud EPG for AOSP builds
PiperOrigin-RevId: 227920076
Change-Id: I2133a8e9c9fb48f62c986a3e51a9ad187f3fe641
diff --git a/src/com/android/tv/data/epg/EpgFetcherImpl.java b/src/com/android/tv/data/epg/EpgFetcherImpl.java
index 0251e66..b191421 100644
--- a/src/com/android/tv/data/epg/EpgFetcherImpl.java
+++ b/src/com/android/tv/data/epg/EpgFetcherImpl.java
@@ -41,6 +41,7 @@
import com.android.tv.TvSingletons;
import com.android.tv.common.BuildConfig;
import com.android.tv.common.SoftPreconditions;
+import com.android.tv.common.buildtype.HasBuildType;
import com.android.tv.common.util.Clock;
import com.android.tv.common.util.CommonUtils;
import com.android.tv.common.util.LocationUtils;
@@ -60,6 +61,7 @@
import com.android.tv.util.Utils;
import com.google.android.tv.partner.support.EpgInput;
import com.google.android.tv.partner.support.EpgInputs;
+import com.google.common.collect.ImmutableSet;
import com.android.tv.common.flags.BackendKnobsFlags;
import java.io.IOException;
import java.util.ArrayList;
@@ -114,7 +116,9 @@
private final ChannelDataManager mChannelDataManager;
private final EpgReader mEpgReader;
private final PerformanceMonitor mPerformanceMonitor;
+ private final EpgInputWhiteList mEpgInputWhiteList;
private final BackendKnobsFlags mBackendKnobsFlags;
+ private final HasBuildType.BuildType mBuildType;
private FetchAsyncTask mFetchTask;
private FetchDuringScanHandler mFetchDuringScanHandler;
private long mEpgTimeStamp;
@@ -133,30 +137,39 @@
PerformanceMonitor performanceMonitor = tvSingletons.getPerformanceMonitor();
EpgReader epgReader = tvSingletons.providesEpgReader().get();
Clock clock = tvSingletons.getClock();
+ EpgInputWhiteList epgInputWhiteList =
+ new EpgInputWhiteList(tvSingletons.getCloudEpgFlags());
BackendKnobsFlags backendKnobsFlags = tvSingletons.getBackendKnobs();
+ HasBuildType.BuildType buildType = tvSingletons.getBuildType();
return new EpgFetcherImpl(
context,
+ epgInputWhiteList,
channelDataManager,
epgReader,
performanceMonitor,
clock,
- backendKnobsFlags);
+ backendKnobsFlags,
+ buildType);
}
@VisibleForTesting
EpgFetcherImpl(
Context context,
+ EpgInputWhiteList epgInputWhiteList,
ChannelDataManager channelDataManager,
EpgReader epgReader,
PerformanceMonitor performanceMonitor,
Clock clock,
- BackendKnobsFlags backendKnobsFlags) {
+ BackendKnobsFlags backendKnobsFlags,
+ HasBuildType.BuildType buildType) {
mContext = context;
mChannelDataManager = channelDataManager;
mEpgReader = epgReader;
mPerformanceMonitor = performanceMonitor;
mClock = clock;
+ mEpgInputWhiteList = epgInputWhiteList;
mBackendKnobsFlags = backendKnobsFlags;
+ mBuildType = buildType;
}
private long getFastFetchDurationSec() {
@@ -352,6 +365,19 @@
if (DEBUG) Log.d(TAG, "Cannot start routine service: scanning channels.");
return false;
}
+ if (!TvFeatures.CLOUD_EPG_FOR_3RD_PARTY.isEnabled(mContext)
+ && mBuildType != HasBuildType.BuildType.AOSP) {
+ if (getTunerChannelCount() == 0) {
+ if (DEBUG) Log.d(TAG, "Cannot start routine service: no internal tuner channels.");
+ return false;
+ }
+ if (!TextUtils.isEmpty(EpgFetchHelper.getLastLineupId(mContext))) {
+ return true;
+ }
+ if (!TextUtils.isEmpty(PostalCodeUtils.getLastPostalCode(mContext))) {
+ return true;
+ }
+ }
return true;
}
@@ -511,6 +537,17 @@
return numbers.size();
}
+ private boolean isInputInWhiteList(EpgInput epgInput) {
+ if (mBuildType == HasBuildType.BuildType.AOSP) {
+ return false;
+ }
+ return (BuildConfig.ENG
+ && epgInput.getInputId()
+ .equals(
+ "com.example.partnersupportsampletvinput/.SampleTvInputService"))
+ || mEpgInputWhiteList.isInputWhiteListed(epgInput.getInputId());
+ }
+
@VisibleForTesting
class FetchAsyncTask extends AsyncTask<Void, Void, Integer> {
private final JobService mService;
@@ -538,12 +575,45 @@
Integer builtInResult = fetchEpgForBuiltInTuner();
boolean anyCloudEpgFailure = false;
boolean anyCloudEpgSuccess = false;
+ if (TvFeatures.CLOUD_EPG_FOR_3RD_PARTY.isEnabled(mContext)
+ && mBuildType != HasBuildType.BuildType.AOSP) {
+ for (EpgInput epgInput : getEpgInputs()) {
+ if (DEBUG) Log.d(TAG, "Start EPG fetch for " + epgInput);
+ if (isCancelled()) {
+ break;
+ }
+ if (isInputInWhiteList(epgInput)) {
+ // TODO(b/66191312) check timestamp and result code and decide if update
+ // is needed.
+ Set<Channel> channels = getExistingChannelsFor(epgInput.getInputId());
+ Integer result = fetchEpgFor(epgInput.getLineupId(), channels);
+ anyCloudEpgFailure = anyCloudEpgFailure || result != null;
+ anyCloudEpgSuccess = anyCloudEpgSuccess || result == null;
+ updateCloudEpgInput(epgInput, result);
+ } else {
+ Log.w(
+ TAG,
+ "Fetching the EPG for "
+ + epgInput.getInputId()
+ + " is not supported.");
+ }
+ }
+ }
+ if (builtInResult == null || builtInResult == REASON_NO_BUILT_IN_CHANNELS) {
+ return anyCloudEpgFailure
+ ? ((Integer) REASON_CLOUD_EPG_FAILURE)
+ : anyCloudEpgSuccess ? null : builtInResult;
+ }
return builtInResult;
} finally {
TrafficStats.setThreadStatsTag(oldTag);
}
}
+ private void updateCloudEpgInput(EpgInput unusedEpgInput, Integer unusedResult) {
+ // TODO(b/66191312) write the result and timestamp to the input table
+ }
+
private Set<Channel> getExistingChannelsFor(String inputId) {
Set<Channel> result = new HashSet<>();
try (Cursor cursor =
@@ -563,6 +633,15 @@
}
}
+ private Set<EpgInput> getEpgInputs() {
+ if (mBuildType == HasBuildType.BuildType.AOSP) {
+ return ImmutableSet.of();
+ }
+ Set<EpgInput> epgInputs = EpgInputs.queryEpgInputs(mContext.getContentResolver());
+ if (DEBUG) Log.d(TAG, "getEpgInputs " + epgInputs);
+ return epgInputs;
+ }
+
private Integer fetchEpgForBuiltInTuner() {
try {
Integer failureReason = prepareFetchEpg(false);