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