11abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/*
21abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Copyright (C) 2015 The Android Open Source Project
31abddd9f6225298066094e20a6c29061b6af4590Nick Chalko *
41abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License");
51abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * you may not use this file except in compliance with the License.
61abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * You may obtain a copy of the License at
71abddd9f6225298066094e20a6c29061b6af4590Nick Chalko *
81abddd9f6225298066094e20a6c29061b6af4590Nick Chalko *      http://www.apache.org/licenses/LICENSE-2.0
91abddd9f6225298066094e20a6c29061b6af4590Nick Chalko *
101abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Unless required by applicable law or agreed to in writing, software
111abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS,
121abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * See the License for the specific language governing permissions and
141abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * limitations under the License.
151abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */
161abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
1765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkopackage com.android.tv.tuner.util;
1865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
1965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport java.util.Locale;
201abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
211abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/**
221abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Utility class for tuner status messages.
231abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */
241abddd9f6225298066094e20a6c29061b6af4590Nick Chalkopublic class StatusTextUtils {
251abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private static final int PACKETS_PER_SEC_YELLOW = 1500;
261abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private static final int PACKETS_PER_SEC_RED = 1000;
271abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private static final int AUDIO_POSITION_MS_RATE_DIFF_YELLOW = 100;
281abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private static final int AUDIO_POSITION_MS_RATE_DIFF_RED = 200;
291abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private static final String COLOR_RED = "red";
301abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private static final String COLOR_YELLOW = "yellow";
311abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private static final String COLOR_GREEN = "green";
321abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private static final String COLOR_GRAY = "gray";
331abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
341abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private StatusTextUtils() { }
351abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
361abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    /**
371abddd9f6225298066094e20a6c29061b6af4590Nick Chalko     * Returns tuner status warning message in HTML.
3865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     *
3965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * <p>This is only called for debuging and always shown in english.</p>
401abddd9f6225298066094e20a6c29061b6af4590Nick Chalko     */
411abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public static String getStatusWarningInHTML(long packetsPerSec,
421abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            int videoFrameDrop, int bytesInQueue,
431abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            long audioPositionUs, long audioPositionUsRate,
441abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            long audioPtsUs, long audioPtsUsRate,
451abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            long videoPtsUs, long videoPtsUsRate) {
461abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        StringBuffer buffer = new StringBuffer();
471abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
481abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        // audioPosition should go in rate of 1000ms.
491abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        long audioPositionMsRate = audioPositionUsRate / 1000;
501abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        String audioPositionColor;
511abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        if (Math.abs(audioPositionMsRate - 1000) > AUDIO_POSITION_MS_RATE_DIFF_RED) {
521abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            audioPositionColor = COLOR_RED;
531abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        } else if (Math.abs(audioPositionMsRate - 1000) > AUDIO_POSITION_MS_RATE_DIFF_YELLOW) {
541abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            audioPositionColor = COLOR_YELLOW;
551abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        } else {
561abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            audioPositionColor = COLOR_GRAY;
571abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        }
5865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        buffer.append(String.format(Locale.US, "<font color=%s>", audioPositionColor));
591abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        buffer.append(
6065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                String.format(Locale.US, "audioPositionMs: %d (%d)<br>", audioPositionUs / 1000,
611abddd9f6225298066094e20a6c29061b6af4590Nick Chalko                        audioPositionMsRate));
621abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        buffer.append("</font>\n");
631abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        buffer.append("<font color=" + COLOR_GRAY + ">");
6465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        buffer.append(String.format(Locale.US, "audioPtsMs: %d (%d, %d)<br>", audioPtsUs / 1000,
651abddd9f6225298066094e20a6c29061b6af4590Nick Chalko                        audioPtsUsRate / 1000, (audioPtsUs - audioPositionUs) / 1000));
6665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        buffer.append(String.format(Locale.US, "videoPtsMs: %d (%d, %d)<br>", videoPtsUs / 1000,
671abddd9f6225298066094e20a6c29061b6af4590Nick Chalko                        videoPtsUsRate / 1000, (videoPtsUs - audioPositionUs) / 1000));
681abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        buffer.append("</font>\n");
691abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
701abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        appendStatusLine(buffer, "KbytesInQueue", bytesInQueue / 1000, 1, 10);
711abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        buffer.append("<br/>");
721abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        appendErrorStatusLine(buffer, "videoFrameDrop", videoFrameDrop, 0, 2);
731abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        buffer.append("<br/>");
741abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        appendStatusLine(buffer, "packetsPerSec", packetsPerSec, PACKETS_PER_SEC_RED,
751abddd9f6225298066094e20a6c29061b6af4590Nick Chalko                PACKETS_PER_SEC_YELLOW);
761abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        return buffer.toString();
771abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
781abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
791abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    /**
801abddd9f6225298066094e20a6c29061b6af4590Nick Chalko     * Returns audio unavailable warning message in HTML.
811abddd9f6225298066094e20a6c29061b6af4590Nick Chalko     */
821abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public static String getAudioWarningInHTML(String msg) {
831abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        return String.format("<font color=%s>%s</font>\n", COLOR_YELLOW, msg);
841abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
851abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
861abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private static void appendStatusLine(StringBuffer buffer, String factorName, long value,
871abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            int minRed, int minYellow) {
881abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        buffer.append("<font color=");
891abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        if (value <= minRed) {
901abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            buffer.append(COLOR_RED);
911abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        } else if (value <= minYellow) {
921abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            buffer.append(COLOR_YELLOW);
931abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        } else {
941abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            buffer.append(COLOR_GREEN);
951abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        }
961abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        buffer.append(">");
971abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        buffer.append(factorName);
981abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        buffer.append(" : ");
991abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        buffer.append(value);
1001abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        buffer.append("</font>");
1011abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
1021abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
1031abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private static void appendErrorStatusLine(StringBuffer buffer, String factorName, int value,
1041abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            int minGreen, int minYellow) {
1051abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        buffer.append("<font color=");
1061abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        if (value <= minGreen) {
1071abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            buffer.append(COLOR_GREEN);
1081abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        } else if (value <= minYellow) {
1091abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            buffer.append(COLOR_YELLOW);
1101abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        } else {
1111abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            buffer.append(COLOR_RED);
1121abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        }
1131abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        buffer.append(">");
1141abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        buffer.append(factorName);
1151abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        buffer.append(" : ");
1161abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        buffer.append(value);
1171abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        buffer.append("</font>");
1181abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
1191abddd9f6225298066094e20a6c29061b6af4590Nick Chalko}
120