TvApplication.java revision a1589bd48e05abbee991e0cdd27fa402a5dc5001
1816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko/* 2816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Copyright (C) 2015 The Android Open Source Project 3816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 4816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License"); 5816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * you may not use this file except in compliance with the License. 6816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * You may obtain a copy of the License at 7816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 8816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * http://www.apache.org/licenses/LICENSE-2.0 9816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * 10816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * Unless required by applicable law or agreed to in writing, software 11816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS, 12816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * See the License for the specific language governing permissions and 14816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko * limitations under the License. 15816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko */ 16816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 17816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkopackage com.android.tv; 18816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 192e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalkoimport android.annotation.TargetApi; 207d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalkoimport android.app.Activity; 211abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport android.content.ComponentName; 22816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.Context; 23816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.Intent; 2465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.content.SharedPreferences; 25816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.pm.PackageInfo; 26816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.content.pm.PackageManager; 27633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalkoimport android.media.tv.TvContract; 28816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.media.tv.TvInputInfo; 29816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.media.tv.TvInputManager; 301abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport android.media.tv.TvInputManager.TvInputCallback; 312e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalkoimport android.os.Build; 32816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.os.Bundle; 331abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport android.support.annotation.Nullable; 3465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport android.text.TextUtils; 35816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.util.Log; 36816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport android.view.KeyEvent; 37944779887775bd950cf1abf348d2df461593f6abLive Channels Teamimport com.android.tv.common.BaseApplication; 38ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport com.android.tv.common.feature.CommonFeatures; 39944779887775bd950cf1abf348d2df461593f6abLive Channels Teamimport com.android.tv.common.recording.RecordingStorageStatusManager; 40ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport com.android.tv.common.ui.setup.animation.SetupAnimationHelper; 41944779887775bd950cf1abf348d2df461593f6abLive Channels Teamimport com.android.tv.common.util.Clock; 42944779887775bd950cf1abf348d2df461593f6abLive Channels Teamimport com.android.tv.common.util.Debug; 43944779887775bd950cf1abf348d2df461593f6abLive Channels Teamimport com.android.tv.common.util.SharedPreferencesUtils; 447d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalkoimport com.android.tv.data.ChannelDataManager; 45633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalkoimport com.android.tv.data.PreviewDataManager; 467d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalkoimport com.android.tv.data.ProgramDataManager; 47633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalkoimport com.android.tv.data.epg.EpgFetcher; 48944779887775bd950cf1abf348d2df461593f6abLive Channels Teamimport com.android.tv.data.epg.EpgFetcherImpl; 491abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport com.android.tv.dvr.DvrDataManager; 501abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport com.android.tv.dvr.DvrDataManagerImpl; 511abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport com.android.tv.dvr.DvrManager; 5265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport com.android.tv.dvr.DvrScheduleManager; 53d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalkoimport com.android.tv.dvr.DvrStorageStatusManager; 5465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport com.android.tv.dvr.DvrWatchedPositionManager; 55633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalkoimport com.android.tv.dvr.recorder.RecordingScheduler; 56633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalkoimport com.android.tv.perf.PerformanceMonitor; 57633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalkoimport com.android.tv.recommendation.ChannelPreviewUpdater; 58633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalkoimport com.android.tv.recommendation.RecordedProgramPreviewUpdater; 59633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalkoimport com.android.tv.tuner.TunerInputController; 6065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport com.android.tv.tuner.util.TunerInputInfoUtils; 611abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport com.android.tv.util.SetupUtils; 6207b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalkoimport com.android.tv.util.TvInputManagerHelper; 63816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport com.android.tv.util.Utils; 64816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalkoimport java.util.List; 65816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 66944779887775bd950cf1abf348d2df461593f6abLive Channels Team/** 67944779887775bd950cf1abf348d2df461593f6abLive Channels Team * Live TV application. 68944779887775bd950cf1abf348d2df461593f6abLive Channels Team * 69944779887775bd950cf1abf348d2df461593f6abLive Channels Team * <p>This includes all the Google specific hooks. 70944779887775bd950cf1abf348d2df461593f6abLive Channels Team */ 71944779887775bd950cf1abf348d2df461593f6abLive Channels Teampublic abstract class TvApplication extends BaseApplication implements TvSingletons, Starter { 72816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private static final String TAG = "TvApplication"; 73816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private static final boolean DEBUG = false; 74633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 75944779887775bd950cf1abf348d2df461593f6abLive Channels Team /** Namespace for LiveChannels configs. LiveChannels configs are kept in piper. */ 76944779887775bd950cf1abf348d2df461593f6abLive Channels Team public static final String CONFIGNS_P4 = "configns:p4"; 77816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 781abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 7995961816a768da387f0b5523cf4363ace2044089Nick Chalko * Broadcast Action: The user has updated LC to a new version that supports tuner input. {@link 80a1589bd48e05abbee991e0cdd27fa402a5dc5001Live Channels Team * TunerInputController} will receive this intent to check the existence of tuner input when the 81a1589bd48e05abbee991e0cdd27fa402a5dc5001Live Channels Team * new version is first launched. 821abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 8365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko public static final String ACTION_APPLICATION_FIRST_LAUNCHED = 84a1589bd48e05abbee991e0cdd27fa402a5dc5001Live Channels Team " com.android.tv.action.APPLICATION_FIRST_LAUNCHED"; 8595961816a768da387f0b5523cf4363ace2044089Nick Chalko 8665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private static final String PREFERENCE_IS_FIRST_LAUNCH = "is_first_launch"; 8765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 88ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko private String mVersionName = ""; 89ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko 90ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko private final MainActivityWrapper mMainActivityWrapper = new MainActivityWrapper(); 911abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 927d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko private SelectInputActivity mSelectInputActivity; 937d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko private ChannelDataManager mChannelDataManager; 94633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko private volatile ProgramDataManager mProgramDataManager; 95633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko private PreviewDataManager mPreviewDataManager; 961abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private DvrManager mDvrManager; 9765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private DvrScheduleManager mDvrScheduleManager; 98ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko private DvrDataManager mDvrDataManager; 9965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private DvrWatchedPositionManager mDvrWatchedPositionManager; 100633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko private RecordingScheduler mRecordingScheduler; 101944779887775bd950cf1abf348d2df461593f6abLive Channels Team private RecordingStorageStatusManager mDvrStorageStatusManager; 10295961816a768da387f0b5523cf4363ace2044089Nick Chalko @Nullable private InputSessionManager mInputSessionManager; 103944779887775bd950cf1abf348d2df461593f6abLive Channels Team // STOP-SHIP: Remove this variable when Tuner Process is split to another application. 10465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko // When this variable is null, we don't know in which process TvApplication runs. 10565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private Boolean mRunningInMainProcess; 106633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko private PerformanceMonitor mPerformanceMonitor; 107944779887775bd950cf1abf348d2df461593f6abLive Channels Team private TvInputManagerHelper mTvInputManagerHelper; 108944779887775bd950cf1abf348d2df461593f6abLive Channels Team private boolean mStarted; 109944779887775bd950cf1abf348d2df461593f6abLive Channels Team private EpgFetcher mEpgFetcher; 110944779887775bd950cf1abf348d2df461593f6abLive Channels Team private TunerInputController mTunerInputController; 111816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 112816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko @Override 113816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public void onCreate() { 114816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko super.onCreate(); 11595961816a768da387f0b5523cf4363ace2044089Nick Chalko SharedPreferencesUtils.initialize( 11695961816a768da387f0b5523cf4363ace2044089Nick Chalko this, 11795961816a768da387f0b5523cf4363ace2044089Nick Chalko new Runnable() { 11895961816a768da387f0b5523cf4363ace2044089Nick Chalko @Override 11995961816a768da387f0b5523cf4363ace2044089Nick Chalko public void run() { 12095961816a768da387f0b5523cf4363ace2044089Nick Chalko if (mRunningInMainProcess != null && mRunningInMainProcess) { 12195961816a768da387f0b5523cf4363ace2044089Nick Chalko checkTunerServiceOnFirstLaunch(); 12295961816a768da387f0b5523cf4363ace2044089Nick Chalko } 12395961816a768da387f0b5523cf4363ace2044089Nick Chalko } 12495961816a768da387f0b5523cf4363ace2044089Nick Chalko }); 1251abddd9f6225298066094e20a6c29061b6af4590Nick Chalko try { 1261abddd9f6225298066094e20a6c29061b6af4590Nick Chalko PackageInfo pInfo = getPackageManager().getPackageInfo(getPackageName(), 0); 127ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko mVersionName = pInfo.versionName; 1281abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } catch (PackageManager.NameNotFoundException e) { 129ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko Log.w(TAG, "Unable to find package '" + getPackageName() + "'.", e); 130ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko mVersionName = ""; 1311abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1321abddd9f6225298066094e20a6c29061b6af4590Nick Chalko Log.i(TAG, "Starting Live TV " + getVersionName()); 13365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 134ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko // In SetupFragment, transitions are set in the constructor. Because the fragment can be 135ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko // created in Activity.onCreate() by the framework, SetupAnimationHelper should be 136ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko // initialized here before Activity.onCreate() is called. 137944779887775bd950cf1abf348d2df461593f6abLive Channels Team mEpgFetcher = EpgFetcherImpl.create(this); 138ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko SetupAnimationHelper.initialize(this); 139944779887775bd950cf1abf348d2df461593f6abLive Channels Team getTvInputManagerHelper(); 140633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 14165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko Log.i(TAG, "Started Live TV " + mVersionName); 142633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko Debug.getTimer(Debug.TAG_START_UP_TIMER).log("finish TvApplication.onCreate"); 14365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 14465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 145944779887775bd950cf1abf348d2df461593f6abLive Channels Team /** Initializes application. It is a noop if called twice. */ 146944779887775bd950cf1abf348d2df461593f6abLive Channels Team @Override 147944779887775bd950cf1abf348d2df461593f6abLive Channels Team public void start() { 148944779887775bd950cf1abf348d2df461593f6abLive Channels Team if (mStarted) { 14965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko return; 15065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 151944779887775bd950cf1abf348d2df461593f6abLive Channels Team mStarted = true; 152944779887775bd950cf1abf348d2df461593f6abLive Channels Team mRunningInMainProcess = true; 153944779887775bd950cf1abf348d2df461593f6abLive Channels Team Debug.getTimer(Debug.TAG_START_UP_TIMER).log("start TvApplication.start"); 15465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko if (mRunningInMainProcess) { 15595961816a768da387f0b5523cf4363ace2044089Nick Chalko getTvInputManagerHelper() 15695961816a768da387f0b5523cf4363ace2044089Nick Chalko .addCallback( 15795961816a768da387f0b5523cf4363ace2044089Nick Chalko new TvInputCallback() { 15895961816a768da387f0b5523cf4363ace2044089Nick Chalko @Override 15995961816a768da387f0b5523cf4363ace2044089Nick Chalko public void onInputAdded(String inputId) { 160944779887775bd950cf1abf348d2df461593f6abLive Channels Team if (TvFeatures.TUNER.isEnabled(TvApplication.this) 16195961816a768da387f0b5523cf4363ace2044089Nick Chalko && TextUtils.equals( 162944779887775bd950cf1abf348d2df461593f6abLive Channels Team inputId, getEmbeddedTunerInputId())) { 16395961816a768da387f0b5523cf4363ace2044089Nick Chalko TunerInputInfoUtils.updateTunerInputInfo( 16495961816a768da387f0b5523cf4363ace2044089Nick Chalko TvApplication.this); 16595961816a768da387f0b5523cf4363ace2044089Nick Chalko } 16695961816a768da387f0b5523cf4363ace2044089Nick Chalko handleInputCountChanged(); 16795961816a768da387f0b5523cf4363ace2044089Nick Chalko } 16895961816a768da387f0b5523cf4363ace2044089Nick Chalko 16995961816a768da387f0b5523cf4363ace2044089Nick Chalko @Override 17095961816a768da387f0b5523cf4363ace2044089Nick Chalko public void onInputRemoved(String inputId) { 17195961816a768da387f0b5523cf4363ace2044089Nick Chalko handleInputCountChanged(); 17295961816a768da387f0b5523cf4363ace2044089Nick Chalko } 17395961816a768da387f0b5523cf4363ace2044089Nick Chalko }); 174944779887775bd950cf1abf348d2df461593f6abLive Channels Team if (TvFeatures.TUNER.isEnabled(this)) { 17565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko // If the tuner input service is added before the app is started, we need to 17665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko // handle it here. 177633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko TunerInputInfoUtils.updateTunerInputInfo(TvApplication.this); 17865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 17965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko if (CommonFeatures.DVR.isEnabled(this)) { 18065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko mDvrScheduleManager = new DvrScheduleManager(this); 18165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko mDvrManager = new DvrManager(this); 182633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko mRecordingScheduler = RecordingScheduler.createScheduler(this); 183633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 184944779887775bd950cf1abf348d2df461593f6abLive Channels Team mEpgFetcher.startRoutineService(); 185633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 186633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko ChannelPreviewUpdater.getInstance(this).startRoutineService(); 187633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko RecordedProgramPreviewUpdater.getInstance(this) 188633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko .updatePreviewDataForRecordedPrograms(); 18965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 19065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 191944779887775bd950cf1abf348d2df461593f6abLive Channels Team Debug.getTimer(Debug.TAG_START_UP_TIMER).log("finish TvApplication.start"); 19265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 19365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 19465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko private void checkTunerServiceOnFirstLaunch() { 19595961816a768da387f0b5523cf4363ace2044089Nick Chalko SharedPreferences sharedPreferences = 19695961816a768da387f0b5523cf4363ace2044089Nick Chalko this.getSharedPreferences( 19795961816a768da387f0b5523cf4363ace2044089Nick Chalko SharedPreferencesUtils.SHARED_PREF_FEATURES, Context.MODE_PRIVATE); 19865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko boolean isFirstLaunch = sharedPreferences.getBoolean(PREFERENCE_IS_FIRST_LAUNCH, true); 19965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko if (isFirstLaunch) { 20065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko if (DEBUG) Log.d(TAG, "Congratulations, it's the first launch!"); 201944779887775bd950cf1abf348d2df461593f6abLive Channels Team getTunerInputController() 202944779887775bd950cf1abf348d2df461593f6abLive Channels Team .onCheckingUsbTunerStatus(this, ACTION_APPLICATION_FIRST_LAUNCHED); 20365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko SharedPreferences.Editor editor = sharedPreferences.edit(); 20465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko editor.putBoolean(PREFERENCE_IS_FIRST_LAUNCH, false); 20565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko editor.apply(); 20665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 2071abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 2081abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 209944779887775bd950cf1abf348d2df461593f6abLive Channels Team @Override 210944779887775bd950cf1abf348d2df461593f6abLive Channels Team public EpgFetcher getEpgFetcher() { 211944779887775bd950cf1abf348d2df461593f6abLive Channels Team return mEpgFetcher; 212944779887775bd950cf1abf348d2df461593f6abLive Channels Team } 213944779887775bd950cf1abf348d2df461593f6abLive Channels Team 214944779887775bd950cf1abf348d2df461593f6abLive Channels Team @Override 215944779887775bd950cf1abf348d2df461593f6abLive Channels Team public synchronized SetupUtils getSetupUtils() { 216944779887775bd950cf1abf348d2df461593f6abLive Channels Team return SetupUtils.createForTvSingletons(this); 217944779887775bd950cf1abf348d2df461593f6abLive Channels Team } 218944779887775bd950cf1abf348d2df461593f6abLive Channels Team 21995961816a768da387f0b5523cf4363ace2044089Nick Chalko /** Returns the {@link DvrManager}. */ 2201abddd9f6225298066094e20a6c29061b6af4590Nick Chalko @Override 2211abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public DvrManager getDvrManager() { 2221abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return mDvrManager; 2231abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 2241abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 22595961816a768da387f0b5523cf4363ace2044089Nick Chalko /** Returns the {@link DvrScheduleManager}. */ 22665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko @Override 22765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko public DvrScheduleManager getDvrScheduleManager() { 22865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko return mDvrScheduleManager; 22965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 23065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 23195961816a768da387f0b5523cf4363ace2044089Nick Chalko /** Returns the {@link RecordingScheduler}. */ 232633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko @Override 233633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko @Nullable 234633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko public RecordingScheduler getRecordingScheduler() { 235633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko return mRecordingScheduler; 236633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 237633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 23895961816a768da387f0b5523cf4363ace2044089Nick Chalko /** Returns the {@link DvrWatchedPositionManager}. */ 23965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko @Override 24065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko public DvrWatchedPositionManager getDvrWatchedPositionManager() { 24165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko if (mDvrWatchedPositionManager == null) { 24265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko mDvrWatchedPositionManager = new DvrWatchedPositionManager(this); 24365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 24465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko return mDvrWatchedPositionManager; 24565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 24665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 2471abddd9f6225298066094e20a6c29061b6af4590Nick Chalko @Override 2482e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko @TargetApi(Build.VERSION_CODES.N) 24965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko public InputSessionManager getInputSessionManager() { 25065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko if (mInputSessionManager == null) { 25165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko mInputSessionManager = new InputSessionManager(this); 2521abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 25365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko return mInputSessionManager; 254816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 255816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 25695961816a768da387f0b5523cf4363ace2044089Nick Chalko /** Returns {@link ChannelDataManager}. */ 2571abddd9f6225298066094e20a6c29061b6af4590Nick Chalko @Override 2587d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko public ChannelDataManager getChannelDataManager() { 2597d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko if (mChannelDataManager == null) { 260633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko mChannelDataManager = new ChannelDataManager(this, getTvInputManagerHelper()); 2617d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko mChannelDataManager.start(); 2627d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko } 2637d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko return mChannelDataManager; 2647d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko } 2657d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko 266633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko @Override 267633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko public boolean isChannelDataManagerLoadFinished() { 268633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko return mChannelDataManager != null && mChannelDataManager.isDbLoadFinished(); 269633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 270633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 27195961816a768da387f0b5523cf4363ace2044089Nick Chalko /** Returns {@link ProgramDataManager}. */ 2721abddd9f6225298066094e20a6c29061b6af4590Nick Chalko @Override 2737d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko public ProgramDataManager getProgramDataManager() { 274633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko if (mProgramDataManager != null) { 275633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko return mProgramDataManager; 2767d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko } 27795961816a768da387f0b5523cf4363ace2044089Nick Chalko Utils.runInMainThreadAndWait( 27895961816a768da387f0b5523cf4363ace2044089Nick Chalko new Runnable() { 27995961816a768da387f0b5523cf4363ace2044089Nick Chalko @Override 28095961816a768da387f0b5523cf4363ace2044089Nick Chalko public void run() { 28195961816a768da387f0b5523cf4363ace2044089Nick Chalko if (mProgramDataManager == null) { 28295961816a768da387f0b5523cf4363ace2044089Nick Chalko mProgramDataManager = new ProgramDataManager(TvApplication.this); 28395961816a768da387f0b5523cf4363ace2044089Nick Chalko mProgramDataManager.start(); 28495961816a768da387f0b5523cf4363ace2044089Nick Chalko } 28595961816a768da387f0b5523cf4363ace2044089Nick Chalko } 28695961816a768da387f0b5523cf4363ace2044089Nick Chalko }); 2877d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko return mProgramDataManager; 2887d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko } 2897d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko 290633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko @Override 291633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko public boolean isProgramDataManagerCurrentProgramsLoadFinished() { 292633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko return mProgramDataManager != null && mProgramDataManager.isCurrentProgramsLoadFinished(); 293633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 294633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 29595961816a768da387f0b5523cf4363ace2044089Nick Chalko /** Returns {@link PreviewDataManager}. */ 296633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko @TargetApi(Build.VERSION_CODES.O) 297633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko @Override 298633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko public PreviewDataManager getPreviewDataManager() { 299633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko if (mPreviewDataManager == null) { 300633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko mPreviewDataManager = new PreviewDataManager(this); 301633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko mPreviewDataManager.start(); 302633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 303633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko return mPreviewDataManager; 304633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 305633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 30695961816a768da387f0b5523cf4363ace2044089Nick Chalko /** Returns {@link DvrDataManager}. */ 3072e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko @TargetApi(Build.VERSION_CODES.N) 3081abddd9f6225298066094e20a6c29061b6af4590Nick Chalko @Override 3091abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public DvrDataManager getDvrDataManager() { 3101abddd9f6225298066094e20a6c29061b6af4590Nick Chalko if (mDvrDataManager == null) { 311d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko DvrDataManagerImpl dvrDataManager = new DvrDataManagerImpl(this, Clock.SYSTEM); 312d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko mDvrDataManager = dvrDataManager; 313d41f0075a7d2ea826204e81fcec57d0aa57171a9Nick Chalko dvrDataManager.start(); 3141abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 3151abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return mDvrDataManager; 3161abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 3171abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 31865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko @Override 319944779887775bd950cf1abf348d2df461593f6abLive Channels Team @TargetApi(Build.VERSION_CODES.N) 320944779887775bd950cf1abf348d2df461593f6abLive Channels Team public RecordingStorageStatusManager getRecordingStorageStatusManager() { 321944779887775bd950cf1abf348d2df461593f6abLive Channels Team if (mDvrStorageStatusManager == null) { 322944779887775bd950cf1abf348d2df461593f6abLive Channels Team mDvrStorageStatusManager = new DvrStorageStatusManager(this); 32365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 324944779887775bd950cf1abf348d2df461593f6abLive Channels Team return mDvrStorageStatusManager; 32565fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 32665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 32738fef3bf253578f518d1bc727da4afb263194398Nick Chalko /** Returns the main activity information. */ 32838fef3bf253578f518d1bc727da4afb263194398Nick Chalko @Override 32938fef3bf253578f518d1bc727da4afb263194398Nick Chalko public MainActivityWrapper getMainActivityWrapper() { 33038fef3bf253578f518d1bc727da4afb263194398Nick Chalko return mMainActivityWrapper; 33138fef3bf253578f518d1bc727da4afb263194398Nick Chalko } 33238fef3bf253578f518d1bc727da4afb263194398Nick Chalko 333944779887775bd950cf1abf348d2df461593f6abLive Channels Team /** Returns {@link TvInputManagerHelper}. */ 33438fef3bf253578f518d1bc727da4afb263194398Nick Chalko @Override 335944779887775bd950cf1abf348d2df461593f6abLive Channels Team public TvInputManagerHelper getTvInputManagerHelper() { 336944779887775bd950cf1abf348d2df461593f6abLive Channels Team if (mTvInputManagerHelper == null) { 337944779887775bd950cf1abf348d2df461593f6abLive Channels Team mTvInputManagerHelper = new TvInputManagerHelper(this); 338944779887775bd950cf1abf348d2df461593f6abLive Channels Team mTvInputManagerHelper.start(); 33938fef3bf253578f518d1bc727da4afb263194398Nick Chalko } 340944779887775bd950cf1abf348d2df461593f6abLive Channels Team return mTvInputManagerHelper; 34138fef3bf253578f518d1bc727da4afb263194398Nick Chalko } 34238fef3bf253578f518d1bc727da4afb263194398Nick Chalko 34365fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko @Override 344944779887775bd950cf1abf348d2df461593f6abLive Channels Team public synchronized TunerInputController getTunerInputController() { 345944779887775bd950cf1abf348d2df461593f6abLive Channels Team if (mTunerInputController == null) { 346944779887775bd950cf1abf348d2df461593f6abLive Channels Team mTunerInputController = 347944779887775bd950cf1abf348d2df461593f6abLive Channels Team new TunerInputController( 348944779887775bd950cf1abf348d2df461593f6abLive Channels Team ComponentName.unflattenFromString(getEmbeddedTunerInputId())); 34965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 350944779887775bd950cf1abf348d2df461593f6abLive Channels Team return mTunerInputController; 35165fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 35265fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 353633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko @Override 354633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko public boolean isRunningInMainProcess() { 355633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko return mRunningInMainProcess != null && mRunningInMainProcess; 356633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 357633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 35865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko /** 35995961816a768da387f0b5523cf4363ace2044089Nick Chalko * SelectInputActivity is set in {@link SelectInputActivity#onCreate} and cleared in {@link 36095961816a768da387f0b5523cf4363ace2044089Nick Chalko * SelectInputActivity#onDestroy}. 3617d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko */ 3627d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko public void setSelectInputActivity(SelectInputActivity activity) { 3637d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko mSelectInputActivity = activity; 364816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 365816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 366633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko public void handleGuideKey() { 367633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko if (!mMainActivityWrapper.isResumed()) { 368633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko startActivity(new Intent(Intent.ACTION_VIEW, TvContract.Programs.CONTENT_URI)); 369633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } else { 370633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko mMainActivityWrapper.getMainActivity().getOverlayManager().toggleProgramGuide(); 371633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 372633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko } 373633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko 37495961816a768da387f0b5523cf4363ace2044089Nick Chalko /** Handles the global key KEYCODE_TV. */ 375816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public void handleTvKey() { 376ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko if (!mMainActivityWrapper.isResumed()) { 377816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko startMainActivity(null); 378816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 379816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 380816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 38195961816a768da387f0b5523cf4363ace2044089Nick Chalko /** Handles the global key KEYCODE_TV_INPUT. */ 382816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko public void handleTvInputKey() { 383816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko TvInputManager tvInputManager = (TvInputManager) getSystemService(Context.TV_INPUT_SERVICE); 384816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko List<TvInputInfo> tvInputs = tvInputManager.getTvInputList(); 385816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko int inputCount = 0; 386816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko boolean hasTunerInput = false; 387816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko for (TvInputInfo input : tvInputs) { 388816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (input.isPassthroughInput()) { 3892e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko if (!input.isHidden(this)) { 3902e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko ++inputCount; 3912e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko } 392816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } else if (!hasTunerInput) { 393816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko hasTunerInput = true; 394816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko ++inputCount; 395816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 396816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 397816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (inputCount < 2) { 398816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko return; 399816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 40095961816a768da387f0b5523cf4363ace2044089Nick Chalko Activity activityToHandle = 40195961816a768da387f0b5523cf4363ace2044089Nick Chalko mMainActivityWrapper.isResumed() 40295961816a768da387f0b5523cf4363ace2044089Nick Chalko ? mMainActivityWrapper.getMainActivity() 40395961816a768da387f0b5523cf4363ace2044089Nick Chalko : mSelectInputActivity; 4047d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko if (activityToHandle != null) { 405816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // If startActivity is called, MainActivity.onPause is unnecessarily called. To 406816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // prevent it, MainActivity.dispatchKeyEvent is directly called. 4077d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko activityToHandle.dispatchKeyEvent( 408816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_TV_INPUT)); 40995961816a768da387f0b5523cf4363ace2044089Nick Chalko activityToHandle.dispatchKeyEvent( 41095961816a768da387f0b5523cf4363ace2044089Nick Chalko new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_TV_INPUT)); 411ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } else if (mMainActivityWrapper.isStarted()) { 412816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko Bundle extras = new Bundle(); 413816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko extras.putString(Utils.EXTRA_KEY_ACTION, Utils.EXTRA_ACTION_SHOW_TV_INPUT); 414816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko startMainActivity(extras); 4157d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko } else { 41695961816a768da387f0b5523cf4363ace2044089Nick Chalko startActivity( 41795961816a768da387f0b5523cf4363ace2044089Nick Chalko new Intent(this, SelectInputActivity.class) 41895961816a768da387f0b5523cf4363ace2044089Nick Chalko .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); 419816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 420816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 421816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 422816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko private void startMainActivity(Bundle extras) { 423816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // The use of FLAG_ACTIVITY_NEW_TASK enables arbitrary applications to access the intent 424816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // sent to the root activity. Having said that, we should be fine here since such an intent 425816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko // does not carry any important user data. 42695961816a768da387f0b5523cf4363ace2044089Nick Chalko Intent intent = 42795961816a768da387f0b5523cf4363ace2044089Nick Chalko new Intent(this, MainActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 428816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko if (extras != null) { 429816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko intent.putExtras(extras); 430816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 431816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko startActivity(intent); 432816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 433816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko 434ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko /** 435ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * Returns the version name of the live channels. 436ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * 437ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko * @see PackageInfo#versionName 438ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko */ 439ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko public String getVersionName() { 440ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko return mVersionName; 441816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko } 44207b043dc3db83d6d20f0e8513b946830ab00e37bNick Chalko 4431abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 444944779887775bd950cf1abf348d2df461593f6abLive Channels Team * Checks the input counts and enable/disable TvActivity. Also upda162 the input list in {@link 44595961816a768da387f0b5523cf4363ace2044089Nick Chalko * SetupUtils}. 4461abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 447944779887775bd950cf1abf348d2df461593f6abLive Channels Team @Override 4481abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public void handleInputCountChanged() { 4492e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko handleInputCountChanged(false, false, false); 4502e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko } 4512e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko 4522e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko /** 45395961816a768da387f0b5523cf4363ace2044089Nick Chalko * Checks the input counts and enable/disable TvActivity. Also updates the input list in {@link 45495961816a768da387f0b5523cf4363ace2044089Nick Chalko * SetupUtils}. 4552e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * 456944779887775bd950cf1abf348d2df461593f6abLive Channels Team * @param calledByTunerServiceChanged true if it is called when BaseTunerTvInputService is 457944779887775bd950cf1abf348d2df461593f6abLive Channels Team * enabled or disabled. 4582e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko * @param tunerServiceEnabled it's available only when calledByTunerServiceChanged is true. 45995961816a768da387f0b5523cf4363ace2044089Nick Chalko * @param dontKillApp when TvActivity is enabled or disabled by this method, the app restarts by 46095961816a768da387f0b5523cf4363ace2044089Nick Chalko * default. But, if dontKillApp is true, the app won't restart. 4612e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko */ 46295961816a768da387f0b5523cf4363ace2044089Nick Chalko public void handleInputCountChanged( 46395961816a768da387f0b5523cf4363ace2044089Nick Chalko boolean calledByTunerServiceChanged, boolean tunerServiceEnabled, boolean dontKillApp) { 4641abddd9f6225298066094e20a6c29061b6af4590Nick Chalko TvInputManager inputManager = (TvInputManager) getSystemService(Context.TV_INPUT_SERVICE); 46595961816a768da387f0b5523cf4363ace2044089Nick Chalko boolean enable = 46695961816a768da387f0b5523cf4363ace2044089Nick Chalko (calledByTunerServiceChanged && tunerServiceEnabled) 467944779887775bd950cf1abf348d2df461593f6abLive Channels Team || TvFeatures.UNHIDE.isEnabled(TvApplication.this); 4682e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko if (!enable) { 4691abddd9f6225298066094e20a6c29061b6af4590Nick Chalko List<TvInputInfo> inputs = inputManager.getTvInputList(); 4702e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko boolean skipTunerInputCheck = false; 4711abddd9f6225298066094e20a6c29061b6af4590Nick Chalko // Enable the TvActivity only if there is at least one tuner type input. 4722e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko if (!skipTunerInputCheck) { 4732e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko for (TvInputInfo input : inputs) { 47495961816a768da387f0b5523cf4363ace2044089Nick Chalko if (calledByTunerServiceChanged 47595961816a768da387f0b5523cf4363ace2044089Nick Chalko && !tunerServiceEnabled 476944779887775bd950cf1abf348d2df461593f6abLive Channels Team && getEmbeddedTunerInputId().equals(input.getId())) { 4772e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko continue; 4782e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko } 4792e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko if (input.getType() == TvInputInfo.TYPE_TUNER) { 4802e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko enable = true; 4812e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko break; 4822e1279b8bbe0603fb4399b25b73121bed5953c46Nick Chalko } 4831abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 4841abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 485ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko if (DEBUG) Log.d(TAG, "Enable MainActivity: " + enable); 486ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko } 487ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko PackageManager packageManager = getPackageManager(); 488ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko ComponentName name = new ComponentName(this, TvActivity.class); 48995961816a768da387f0b5523cf4363ace2044089Nick Chalko int newState = 49095961816a768da387f0b5523cf4363ace2044089Nick Chalko enable 49195961816a768da387f0b5523cf4363ace2044089Nick Chalko ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED 49295961816a768da387f0b5523cf4363ace2044089Nick Chalko : PackageManager.COMPONENT_ENABLED_STATE_DISABLED; 493ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko if (packageManager.getComponentEnabledSetting(name) != newState) { 49495961816a768da387f0b5523cf4363ace2044089Nick Chalko packageManager.setComponentEnabledSetting( 49595961816a768da387f0b5523cf4363ace2044089Nick Chalko name, newState, dontKillApp ? PackageManager.DONT_KILL_APP : 0); 496633eb826b8c97731dfc5ef12c7bf78a63734275dNick Chalko Log.i(TAG, (enable ? "Un-hide" : "Hide") + " Live TV."); 4971abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 498944779887775bd950cf1abf348d2df461593f6abLive Channels Team getSetupUtils().onInputListUpdated(inputManager); 49965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko } 500816a4be1a0f34f6a48877c8afd3dbbca19eac435Nick Chalko} 501