144f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer/*
244f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer * Copyright (C) 2016 The Android Open Source Project
344f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer *
444f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer * Licensed under the Apache License, Version 2.0 (the "License");
544f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer * you may not use this file except in compliance with the License.
644f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer * You may obtain a copy of the License at
744f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer *
844f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer *      http://www.apache.org/licenses/LICENSE-2.0
944f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer *
1044f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer * Unless required by applicable law or agreed to in writing, software
1144f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer * distributed under the License is distributed on an "AS IS" BASIS,
1244f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1344f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer * See the License for the specific language governing permissions and
1444f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer * limitations under the License.
1544f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer */
1644f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer
1744f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyerpackage com.android.car.radio;
1844f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer
1944f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyerimport android.content.Context;
2044f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyerimport android.hardware.radio.RadioManager;
2144f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyerimport com.android.car.radio.service.RadioStation;
2244f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer
2344f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyerimport java.text.DecimalFormat;
2444f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyerimport java.util.Locale;
2544f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer
2644f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer/**
2744f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer * Common formatters for displaying channel numbers for various radio bands.
2844f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer */
2944f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyerpublic final class RadioChannelFormatter {
3044f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer    private static final String FM_CHANNEL_FORMAT = "###.#";
3144f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer    private static final String AM_CHANNEL_FORMAT = "####";
3244f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer
3344f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer    private RadioChannelFormatter() {}
3444f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer
3544f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer    /**
3644f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer     * The formatter for AM radio stations.
3744f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer     */
3844f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer    public static final DecimalFormat FM_FORMATTER = new DecimalFormat(FM_CHANNEL_FORMAT);
3944f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer
4044f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer    /**
4144f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer     * The formatter for FM radio stations.
4244f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer     */
4344f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer    public static final DecimalFormat AM_FORMATTER = new DecimalFormat(AM_CHANNEL_FORMAT);
4444f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer
4544f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer    /**
4644f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer     * Convenience method to format a given {@link RadioStation} based on the value in
4744f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer     * {@link RadioStation#getRadioBand()}. If the band is invalid or support for its formatting is
4844f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer     * not available, then an empty String is returned.
4944f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer     *
5044f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer     * @param band One of the band values specified in {@link RadioManager}. For example,
5144f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer     *             {@link RadioManager#BAND_FM}.
5244f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer     * @param channelNumber The channel number to format. This value should be in KHz.
5344f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer     * @return A correctly formatted channel number or an empty string if one cannot be formed.
5444f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer     */
5544f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer    public static String formatRadioChannel(int band, int channelNumber) {
5644f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer        switch (band) {
5744f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer            case RadioManager.BAND_AM:
5844f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer                return AM_FORMATTER.format(channelNumber);
5944f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer
6044f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer            case RadioManager.BAND_FM:
6144f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer                // FM channels are displayed in KHz, so divide by 1000.
6244f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer                return FM_FORMATTER.format((float) channelNumber / 1000);
6344f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer
6444f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer            // TODO: Handle formats for AM and FM HD stations.
6544f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer
6644f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer            default:
6744f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer                return "";
6844f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer        }
6944f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer    }
7044f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer
7144f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer    /**
7244f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer     * Formats the given band value into a readable String.
7344f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer     *
7444f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer     * @param band One of the band values specified in {@link RadioManager}. For example,
7544f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer     *             {@link RadioManager#BAND_FM}.
7644f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer     * @return The formatted string or an empty string if the band is invalid.
7744f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer     */
7844f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer    public static String formatRadioBand(Context context, int band) {
7944f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer        String radioBandText;
8044f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer
8144f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer        switch (band) {
8244f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer            case RadioManager.BAND_AM:
8344f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer                radioBandText = context.getString(R.string.radio_am_text);
8444f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer                break;
8544f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer
8644f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer            case RadioManager.BAND_FM:
8744f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer                radioBandText = context.getString(R.string.radio_fm_text);
8844f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer                break;
8944f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer
9044f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer            // TODO: Handle formats for AM and FM HD stations.
9144f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer
9244f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer            default:
9344f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer                radioBandText = "";
9444f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer        }
9544f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer
9644f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer        return radioBandText.toUpperCase(Locale.getDefault());
9744f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer    }
9844f17dab6698b8c5d87672f5df71c471bd4b91a3Rakesh Iyer}
99