1816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/* 2816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Copyright (C) 2015 The Android Open Source Project 3816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 4816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License"); 5816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * you may not use this file except in compliance with the License. 6816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * You may obtain a copy of the License at 7816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 8816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * http://www.apache.org/licenses/LICENSE-2.0 9816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 10816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Unless required by applicable law or agreed to in writing, software 11816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS, 12816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * See the License for the specific language governing permissions and 14816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * limitations under the License. 15816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 16816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 17816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopackage com.android.tv.recommendation; 18816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 19816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.List; 20816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 21816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopublic class FavoriteChannelEvaluator extends Recommender.Evaluator { 22816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private static final long MIN_WATCH_PERIOD_MS = 1000 * 60 * 60 * 24; // 1 day 23816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // When there is no watch history, use the current time as a default value. 24816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private long mEarliestWatchStartTimeMs = System.currentTimeMillis(); 25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 26816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 27816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko protected void onChannelRecordListChanged(List<ChannelRecord> channelRecords) { 28816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko for (ChannelRecord cr : channelRecords) { 29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko WatchedProgram[] watchedPrograms = cr.getWatchHistory(); 30816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (watchedPrograms.length > 0 31816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko && mEarliestWatchStartTimeMs > watchedPrograms[0].getWatchStartTimeMs()) { 32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko mEarliestWatchStartTimeMs = watchedPrograms[0].getWatchStartTimeMs(); 33816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 34816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 35816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 36816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 37816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 38816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public double evaluateChannel(long channelId) { 39816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko ChannelRecord cr = getRecommender().getChannelRecord(channelId); 40816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (cr == null) { 41816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return NOT_RECOMMENDED; 42816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 43816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 44816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (cr.getTotalWatchDurationMs() == 0) { 45816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return NOT_RECOMMENDED; 46816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 47816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 48816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko long watchPeriodMs = System.currentTimeMillis() - mEarliestWatchStartTimeMs; 49816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return (double) cr.getTotalWatchDurationMs() / 50816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko Math.max(watchPeriodMs, MIN_WATCH_PERIOD_MS); 51816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 52816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko} 53