/*
 * Copyright (C) 2015 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.analytics;

import com.android.tv.TimeShiftManager;
import com.android.tv.data.api.Channel;

/** Interface for sending user activity for analysis. */
public interface Tracker {

    /**
     * Send the number of channels that doesn't change often.
     *
     * <p>Because the number of channels does not change often, this method should not be called
     * more than once a day.
     *
     * @param browsableChannelCount the number of browsable channels.
     * @param totalChannelCount the number of all channels.
     */
    void sendChannelCount(int browsableChannelCount, int totalChannelCount);

    /**
     * Send data that doesn't change often.
     *
     * <p>Because configuration info does not change often, this method should not be called more
     * than once a day.
     *
     * @param info the configuration info.
     */
    void sendConfigurationInfo(ConfigurationInfo info);

    /** Sends tracking information for starting the MainActivity. */
    void sendMainStart();

    /**
     * Sends tracking for stopping MainActivity.
     *
     * @param durationMs The time main activity was "started" in milliseconds.
     */
    void sendMainStop(long durationMs);

    /** Sets the screen name and sends a ScreenView hit. */
    void sendScreenView(String screenName);

    /**
     * Sends tracking information for starting to view a channel.
     *
     * @param channel the current channel
     * @param tunedByRecommendation True, if the channel was tuned by the recommendation.
     */
    void sendChannelViewStart(Channel channel, boolean tunedByRecommendation);

    /**
     * Sends tracking information for tuning to a channel.
     *
     * @param channel The channel that was being tuned.
     * @param durationMs The time the channel took to tune in milliseconds.
     */
    void sendChannelTuneTime(Channel channel, long durationMs);

    /**
     * Sends tracking information for stopping viewing a channel.
     *
     * @param channel The channel that was being watched.
     * @param durationMs The time the channel was watched in milliseconds.
     */
    void sendChannelViewStop(Channel channel, long durationMs);

    /** Sends tracking information for pressing channel up. */
    void sendChannelUp();

    /** Sends tracking information for pressing channel down. */
    void sendChannelDown();

    /** Sends tracking information for showing the main menu. */
    void sendShowMenu();

    /**
     * Sends tracking for hiding the main menu.
     *
     * @param durationMs The duration the menu was shown in milliseconds.
     */
    void sendHideMenu(long durationMs);

    /**
     * Sends tracking for clicking a menu item.
     *
     * <p><strong>WARNING</strong> callers must ensure no PII is included in the label.
     *
     * @param label The label of the item clicked.
     */
    void sendMenuClicked(String label);

    /**
     * Sends tracking for clicking a menu item.
     *
     * <p>NOTE: the tracker will use the english version of the label.
     *
     * @param labelResId The resource Id of the label for the menu item.
     */
    void sendMenuClicked(int labelResId);

    /** Sends tracking information for showing the Electronic Program Guide (EPG). */
    void sendShowEpg();

    /** Sends tracking information for clicking an Electronic Program Guide (EPG) item. */
    void sendEpgItemClicked();

    /**
     * Sends tracking for hiding the Electronic Program Guide (EPG).
     *
     * @param durationMs The duration the EPG was shown in milliseconds.
     */
    void sendHideEpg(long durationMs);

    /** Sends tracking information for showing the channel switch view. */
    void sendShowChannelSwitch();

    /**
     * Sends tracking for hiding the channel switch view.
     *
     * @param durationMs The duration the channel switch view was shown in milliseconds.
     */
    void sendHideChannelSwitch(long durationMs);

    /** Sends tracking for each channel number or delimiter pressed. */
    void sendChannelNumberInput();

    /**
     * Sends tracking for navigating during channel number input.
     *
     * <p>This is sent once per channel input viewing.
     */
    void sendChannelInputNavigated();

    /** Sends tracking for channel clicked. */
    void sendChannelNumberItemClicked();

    /** Sends tracking for channel chosen (tuned) because the channel switch view timed out. */
    void sendChannelNumberItemChosenByTimeout();

    /** Sends tracking for the reason video is unavailable on a channel. */
    void sendChannelVideoUnavailable(Channel channel, int reason);

    /**
     * Sends HDMI AC3 passthrough capabilities.
     *
     * @param isSupported {@code true} if the feature is supported; otherwise {@code false}.
     */
    void sendAc3PassthroughCapabilities(boolean isSupported);

    /**
     * Sends tracking for input a connection failure.
     *
     * <p><strong>WARNING</strong> callers must ensure no PII is included in the inputId.
     *
     * @param inputId the input the failure happened on
     */
    void sendInputConnectionFailure(String inputId);

    /**
     * Sends tracking for input disconnected.
     *
     * <p><strong>WARNING</strong> callers must ensure no PII is included in the inputId.
     *
     * @param inputId the input the failure happened on
     */
    void sendInputDisconnected(String inputId);

    /** Sends tracking information for showing the input selection view. */
    void sendShowInputSelection();

    /**
     * Sends tracking for hiding the input selection view.
     *
     * @param durationMs The duration the input selection view was shown in milliseconds.
     */
    void sendHideInputSelection(long durationMs);

    /**
     * Sends tracking for input selected by the selection view.
     *
     * <p><strong>WARNING</strong> callers must ensure no PII is included in the label.
     *
     * @param inputLabel the label of the TV input selected
     */
    void sendInputSelected(String inputLabel);

    /**
     * Sends tracking information for showing a side panel.
     *
     * @param trackerLabel the label of the side panel.
     */
    void sendShowSidePanel(HasTrackerLabel trackerLabel);

    /**
     * Sends tracking for hiding a side panel.
     *
     * @param trackerLabel The label of the side panel
     * @param durationMs The duration the side panel was shown in milliseconds.
     */
    void sendHideSidePanel(HasTrackerLabel trackerLabel, long durationMs);

    /**
     * Sends time shift action (pause, ff, etc).
     *
     * @param actionId The {@link com.android.tv.TimeShiftManager.TimeShiftActionId}
     */
    void sendTimeShiftAction(@TimeShiftManager.TimeShiftActionId int actionId);
}
