aboutsummaryrefslogtreecommitdiff
path: root/tests/common/src/com/android/tv/testing/FakeEpgReader.java
diff options
context:
space:
mode:
Diffstat (limited to 'tests/common/src/com/android/tv/testing/FakeEpgReader.java')
-rw-r--r--tests/common/src/com/android/tv/testing/FakeEpgReader.java164
1 files changed, 164 insertions, 0 deletions
diff --git a/tests/common/src/com/android/tv/testing/FakeEpgReader.java b/tests/common/src/com/android/tv/testing/FakeEpgReader.java
new file mode 100644
index 00000000..710ada55
--- /dev/null
+++ b/tests/common/src/com/android/tv/testing/FakeEpgReader.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.tv.testing;
+
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.util.Range;
+import com.android.tv.data.ChannelImpl;
+import com.android.tv.data.ChannelNumber;
+import com.android.tv.data.Lineup;
+import com.android.tv.data.Program;
+import com.android.tv.data.api.Channel;
+import com.android.tv.data.epg.EpgReader;
+import com.android.tv.dvr.data.SeriesInfo;
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.LinkedListMultimap;
+import com.google.common.collect.ListMultimap;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/** Fake {@link EpgReader} for testing. */
+public final class FakeEpgReader implements EpgReader {
+ public final ListMultimap<String, Lineup> zip2lineups = LinkedListMultimap.create(2);
+ public final ListMultimap<String, Channel> lineup2Channels = LinkedListMultimap.create(2);
+ public final ListMultimap<String, Program> epgChannelId2Programs = LinkedListMultimap.create(2);
+ public final FakeClock fakeClock;
+
+ public FakeEpgReader(FakeClock fakeClock) {
+ this.fakeClock = fakeClock;
+ }
+
+ @Override
+ public boolean isAvailable() {
+ return true;
+ }
+
+ @Override
+ public long getEpgTimestamp() {
+ return fakeClock.currentTimeMillis();
+ }
+
+ @Override
+ public void setRegionCode(String regionCode) {}
+
+ @Override
+ public List<Lineup> getLineups(@NonNull String postalCode) {
+ return zip2lineups.get(postalCode);
+ }
+
+ @Override
+ public List<String> getChannelNumbers(@NonNull String lineupId) {
+ return null;
+ }
+
+ @Override
+ public Set<EpgChannel> getChannels(Set<Channel> inputChannels, @NonNull String lineupId) {
+ Set<EpgChannel> result = new HashSet<>();
+ List<Channel> lineupChannels = lineup2Channels.get(lineupId);
+ for (Channel channel : lineupChannels) {
+ Channel match =
+ Iterables.find(
+ inputChannels,
+ new Predicate<Channel>() {
+ @Override
+ public boolean apply(@Nullable Channel inputChannel) {
+ return ChannelNumber.equivalent(
+ inputChannel.getDisplayNumber(),
+ channel.getDisplayNumber());
+ }
+ },
+ null);
+ if (match != null) {
+ ChannelImpl updatedChannel = new ChannelImpl.Builder(match).build();
+ updatedChannel.setLogoUri(channel.getLogoUri());
+ result.add(EpgChannel.createEpgChannel(updatedChannel, channel.getDisplayNumber()));
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public void preloadChannels(@NonNull String lineupId) {}
+
+ @Override
+ public void clearCachedChannels(@NonNull String lineupId) {}
+
+ @Override
+ public List<Program> getPrograms(EpgChannel epgChannel) {
+ return ImmutableList.copyOf(
+ Iterables.transform(
+ epgChannelId2Programs.get(epgChannel.getEpgChannelId()),
+ updateWith(epgChannel)));
+ }
+
+ @Override
+ public Map<EpgChannel, Collection<Program>> getPrograms(
+ @NonNull Set<EpgChannel> epgChannels, long duration) {
+ Range<Long> validRange =
+ Range.create(
+ fakeClock.currentTimeMillis(), fakeClock.currentTimeMillis() + duration);
+ ImmutableMap.Builder<EpgChannel, Collection<Program>> mapBuilder = ImmutableMap.builder();
+ for (EpgChannel epgChannel : epgChannels) {
+ Iterable<Program> programs = getPrograms(epgChannel);
+
+ mapBuilder.put(
+ epgChannel,
+ ImmutableList.copyOf(Iterables.filter(programs, isProgramDuring(validRange))));
+ }
+ return mapBuilder.build();
+ }
+
+ protected Function<Program, Program> updateWith(final EpgChannel channel) {
+ return new Function<Program, Program>() {
+ @Nullable
+ @Override
+ public Program apply(@Nullable Program program) {
+ return new Program.Builder(program)
+ .setChannelId(channel.getChannel().getId())
+ .setPackageName(channel.getChannel().getPackageName())
+ .build();
+ }
+ };
+ }
+
+ /**
+ * True if the start time or the end time is {@link Range#contains contained (inclusive)} in the
+ * range
+ */
+ protected Predicate<Program> isProgramDuring(final Range<Long> validRange) {
+ return new Predicate<Program>() {
+ @Override
+ public boolean apply(@Nullable Program program) {
+ return validRange.contains(program.getStartTimeUtcMillis())
+ || validRange.contains(program.getEndTimeUtcMillis());
+ }
+ };
+ }
+
+ @Override
+ public SeriesInfo getSeriesInfo(@NonNull String seriesId) {
+ return null;
+ }
+}