/* * 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 com.android.tv.data.ChannelImpl; import com.android.tv.data.Lineup; import com.android.tv.data.Program; import com.android.tv.data.api.Channel; import com.google.common.base.Function; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableListMultimap; import com.google.common.collect.Iterables; import com.google.common.collect.ListMultimap; import java.util.concurrent.TimeUnit; /** EPG data for use in tests. */ public abstract class EpgTestData { public static final android.support.media.tv.Channel CHANNEL_10 = new android.support.media.tv.Channel.Builder() .setDisplayName("Channel TEN") .setDisplayNumber("10") .build(); public static final android.support.media.tv.Channel CHANNEL_11 = new android.support.media.tv.Channel.Builder() .setDisplayName("Channel Eleven") .setDisplayNumber("11") .build(); public static final android.support.media.tv.Channel CHANNEL_90_2 = new android.support.media.tv.Channel.Builder() .setDisplayName("Channel Ninety dot Two") .setDisplayNumber("90.2") .build(); public static final Lineup LINEUP_1 = new Lineup( "lineup1", Lineup.LINEUP_SATELLITE, "Lineup one", "Location one", ImmutableList.of("1", "2.2")); public static final Lineup LINEUP_2 = new Lineup( "lineup2", Lineup.LINEUP_SATELLITE, "Lineup two", "Location two", ImmutableList.of("1", "2.3")); public static final Lineup LINEUP_90210 = new Lineup( "test90210", Lineup.LINEUP_BROADCAST_DIGITAL, "Test 90210", "Beverly Hills", ImmutableList.of("90.2", "10")); // Programs start and end times are set relative to 0. // Then when loaded they are offset by the {@link #getStartTimeMs}. // Start and end time may be negative meaning they happen before "now". public static final Program PROGRAM_1 = new Program.Builder() .setTitle("Program 1") .setStartTimeUtcMillis(0) .setEndTimeUtcMillis(TimeUnit.MINUTES.toMillis(30)) .build(); public static final Program PROGRAM_2 = new Program.Builder() .setTitle("Program 2") .setStartTimeUtcMillis(TimeUnit.MINUTES.toMillis(30)) .setEndTimeUtcMillis(TimeUnit.MINUTES.toMillis(60)) .build(); public static final EpgTestData DATA_90210 = new EpgTestData() { // Thursday, June 1, 2017 4:00:00 PM GMT-07:00 private final long testStartTimeMs = 1496358000000L; @Override public ListMultimap getLineups() { ImmutableListMultimap.Builder builder = ImmutableListMultimap.builder(); return builder.putAll("90210", LINEUP_1, LINEUP_2, LINEUP_90210).build(); } @Override public ListMultimap getLineupChannels() { ImmutableListMultimap.Builder builder = ImmutableListMultimap.builder(); return builder.putAll( LINEUP_90210.getId(), toTvChannels(CHANNEL_90_2, CHANNEL_10)) .putAll(LINEUP_1.getId(), toTvChannels(CHANNEL_10, CHANNEL_11)) .build(); } @Override public ListMultimap getEpgPrograms() { ImmutableListMultimap.Builder builder = ImmutableListMultimap.builder(); return builder.putAll( CHANNEL_10.getDisplayNumber(), EpgTestData.updateTime(getStartTimeMs(), PROGRAM_1)) .putAll( CHANNEL_11.getDisplayNumber(), EpgTestData.updateTime(getStartTimeMs(), PROGRAM_2)) .build(); } @Override public long getStartTimeMs() { return testStartTimeMs; } }; public abstract ListMultimap getLineups(); public abstract ListMultimap getLineupChannels(); public abstract ListMultimap getEpgPrograms(); /** The starting time for this test data */ public abstract long getStartTimeMs(); /** * Loads test data * *

* *

    *
  • Sets clock to {@link #getStartTimeMs()} and boot time to 12 hours before that *
  • Loads lineups *
  • Loads lineupChannels *
  • Loads epgPrograms *
*/ public final void loadData(FakeClock clock, FakeEpgReader epgReader) { clock.setBootTimeMillis(getStartTimeMs() + TimeUnit.HOURS.toMillis(-12)); clock.setCurrentTimeMillis(getStartTimeMs()); epgReader.zip2lineups.putAll(getLineups()); epgReader.lineup2Channels.putAll(getLineupChannels()); epgReader.epgChannelId2Programs.putAll(getEpgPrograms()); } public final void loadData(TestSingletonApp testSingletonApp) { loadData(testSingletonApp.fakeClock, testSingletonApp.epgReader); } private static Iterable toTvChannels(android.support.media.tv.Channel... channels) { return Iterables.transform( ImmutableList.copyOf(channels), new Function() { @Override public Channel apply(android.support.media.tv.Channel original) { return toTvChannel(original); } }); } public static Channel toTvChannel(android.support.media.tv.Channel original) { return new ChannelImpl.Builder() .setDisplayName(original.getDisplayName()) .setDisplayNumber(original.getDisplayNumber()) // TODO implement the reset .build(); } /** Add time to the startTime and stopTime of each program */ private static Iterable updateTime(long time, Program... programs) { return Iterables.transform( ImmutableList.copyOf(programs), new Function() { @Override public Program apply(Program p) { return new Program.Builder(p) .setStartTimeUtcMillis(p.getStartTimeUtcMillis() + time) .setEndTimeUtcMillis(p.getEndTimeUtcMillis() + time) .build(); } }); } }