165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko/*
265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Copyright (C) 2016 The Android Open Source Project
365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko *
465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License");
565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * you may not use this file except in compliance with the License.
665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * You may obtain a copy of the License at
765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko *
865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko *      http://www.apache.org/licenses/LICENSE-2.0
965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko *
1065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Unless required by applicable law or agreed to in writing, software
1165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS,
1265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * See the License for the specific language governing permissions and
1465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * limitations under the License.
1565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko */
1665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
1765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkopackage com.android.tv.tuner.util;
1865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
1965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.annotation.TargetApi;
2065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.content.ComponentName;
2165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.content.Context;
2265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.media.tv.TvInputInfo;
2365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.media.tv.TvInputManager;
246ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.os.AsyncTask;
2565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.os.Build;
2665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.support.annotation.Nullable;
2765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.util.Log;
286ebde20b03db4c0d57f67acaac11832b610b966bNick Chalkoimport android.util.Pair;
2965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
3065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport com.android.tv.common.feature.CommonFeatures;
3165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport com.android.tv.tuner.R;
3265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport com.android.tv.tuner.TunerHal;
3365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport com.android.tv.tuner.tvinput.TunerTvInputService;
3465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
3565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko/**
3665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * Utility class for providing tuner input info.
3765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko */
3865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkopublic class TunerInputInfoUtils {
3965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private static final String TAG = "TunerInputInfoUtils";
4065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    private static final boolean DEBUG = false;
4165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
4265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
4365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * Builds tuner input's info.
4465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
4565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    @Nullable
4665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    @TargetApi(Build.VERSION_CODES.N)
476ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko    public static TvInputInfo buildTunerInputInfo(Context context) {
486ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        Pair<Integer, Integer> tunerTypeAndCount = TunerHal.getTunerTypeAndCount(context);
496ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        if (tunerTypeAndCount.first == null || tunerTypeAndCount.second == 0) {
5065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return null;
5165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
526ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        int inputLabelId = 0;
536ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        switch (tunerTypeAndCount.first) {
546ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            case TunerHal.TUNER_TYPE_BUILT_IN:
556ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                inputLabelId = R.string.bt_app_name;
566ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                break;
576ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            case TunerHal.TUNER_TYPE_USB:
586ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                inputLabelId = R.string.ut_app_name;
596ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                break;
606ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            case TunerHal.TUNER_TYPE_NETWORK:
616ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                inputLabelId = R.string.nt_app_name;
626ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                break;
6365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
6465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        try {
656ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            TvInputInfo.Builder builder = new TvInputInfo.Builder(context,
666ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    new ComponentName(context, TunerTvInputService.class));
676ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            return builder.setLabel(inputLabelId)
686ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    .setCanRecord(CommonFeatures.DVR.isEnabled(context))
696ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    .setTunerCount(tunerTypeAndCount.second)
7065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                    .build();
716ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        } catch (IllegalArgumentException | NullPointerException e) {
7265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            // TunerTvInputService is not enabled.
7365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko            return null;
7465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
7565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
7665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko
7765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    /**
7865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * Updates tuner input's info.
7965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     *
8065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     * @param context {@link Context} instance
8165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko     */
8265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    public static void updateTunerInputInfo(Context context) {
836ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        final Context appContext = context.getApplicationContext();
846ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
856ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            new AsyncTask<Void, Void, TvInputInfo>() {
866ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                @Override
876ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                protected TvInputInfo doInBackground(Void... params) {
886ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    if (DEBUG) Log.d(TAG, "updateTunerInputInfo()");
896ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    return buildTunerInputInfo(appContext);
9065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                }
916ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko
926ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                @Override
936ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                @TargetApi(Build.VERSION_CODES.N)
946ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                protected void onPostExecute(TvInputInfo info) {
956ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    if (info != null) {
966ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        ((TvInputManager) appContext.getSystemService(Context.TV_INPUT_SERVICE))
976ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                .updateTvInputInfo(info);
986ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        if (DEBUG) {
996ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                            Log.d(
1006ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                    TAG,
1016ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                    "TvInputInfo ["
1026ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                            + info.loadLabel(appContext)
1036ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                            + "] updated: "
1046ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                                            + info.toString());
1056ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        }
1066ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    } else {
1076ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        if (DEBUG) {
1086ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                            Log.d(TAG, "Updating tuner input info failed. Input is not ready yet.");
1096ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                        }
1106ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko                    }
11165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko                }
1126ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko            }.execute();
11365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko        }
11465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko    }
1156ebde20b03db4c0d57f67acaac11832b610b966bNick Chalko}