aboutsummaryrefslogtreecommitdiff
path: root/partner_support/src/com/google/android/tv/partner/support/TunerSetupUtils.java
blob: e25d5836433ca569152a92e1c96f75f9278fcdce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/*
 * 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.google.android.tv.partner.support;

import android.support.annotation.VisibleForTesting;
import android.text.TextUtils;
import android.util.Log;
import android.util.Pair;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.regex.Pattern;

/** Utility class for providing tuner setup. */
public class TunerSetupUtils {
    private static final String TAG = "TunerSetupUtils";

    private static final Pattern CHANNEL_NUMBER_DELIMITER = Pattern.compile("([ .-])");

    public static List<Pair<Lineup, Integer>> lineupChannelMatchCount(
            List<Lineup> lineups, List<String> localChannels) {
        List<Pair<Lineup, Integer>> result = new ArrayList<>();
        List<List<String>> parsedLocalChannels = parseChannelNumbers(localChannels);
        for (Lineup lineup : lineups) {
            result.add(
                    new Pair<>(lineup, getMatchCount(lineup.getChannels(), parsedLocalChannels)));
        }
        // sort in decreasing order
        Collections.sort(
                result,
                new Comparator<Pair<Lineup, Integer>>() {
                    @Override
                    public int compare(Pair<Lineup, Integer> pair, Pair<Lineup, Integer> other) {
                        return Integer.compare(other.second, pair.second);
                    }
                });
        return result;
    }

    @VisibleForTesting
    static int getMatchCount(List<String> lineupChannels, List<List<String>> parsedLocalChannels) {
        int count = 0;
        List<List<String>> parsedLineupChannels = parseChannelNumbers(lineupChannels);
        for (List<String> parsedLineupChannel : parsedLineupChannels) {
            for (List<String> parsedLocalChannel : parsedLocalChannels) {
                if (matchChannelNumber(parsedLineupChannel, parsedLocalChannel)) {
                    count++;
                    break;
                }
            }
        }
        return count;
    }

    /**
     * Parses the channel number string to a list of numbers (major number, minor number, etc.).
     *
     * @param channelNumber the display number of the channel
     * @return a list of numbers
     */
    @VisibleForTesting
    static List<String> parseChannelNumber(String channelNumber) {
        List<String> numbers =
                new ArrayList<>(
                        Arrays.asList(TextUtils.split(channelNumber, CHANNEL_NUMBER_DELIMITER)));
        numbers.removeAll(Collections.singleton(""));
        if (numbers.size() < 1 || numbers.size() > 2) {
            Log.w(TAG, "unsupported channel number format: " + channelNumber);
            return new ArrayList<>();
        }
        return numbers;
    }

    /**
     * Parses a list of channel numbers. See {@link #parseChannelNumber(String)}.
     *
     * @param channelNumbers a list of channel display numbers
     */
    @VisibleForTesting
    static List<List<String>> parseChannelNumbers(List<String> channelNumbers) {
        List<List<String>> numbers = new ArrayList<>(channelNumbers.size());
        for (String channelNumber : channelNumbers) {
            if (!TextUtils.isEmpty(channelNumber)) {
                numbers.add(parseChannelNumber(channelNumber));
            }
        }
        return numbers;
    }

    /**
     * Checks whether two lists of channel numbers match or not. If the sizes are different,
     * additional elements are ignore.
     */
    @VisibleForTesting
    static boolean matchChannelNumber(List<String> numbers, List<String> other) {
        if (numbers.isEmpty() || other.isEmpty()) {
            return false;
        }
        int i = 0;
        int j = 0;
        while (i < numbers.size() && j < other.size()) {
            if (!numbers.get(i++).equals(other.get(j++))) {
                return false;
            }
        }
        return true;
    }
}