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}