17d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko/*
27d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko * Copyright (C) 2015 The Android Open Source Project
37d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko *
47d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License");
57d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko * you may not use this file except in compliance with the License.
67d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko * You may obtain a copy of the License at
77d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko *
87d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko *      http://www.apache.org/licenses/LICENSE-2.0
97d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko *
107d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko * Unless required by applicable law or agreed to in writing, software
117d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS,
127d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko * See the License for the specific language governing permissions and
147d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko * limitations under the License.
157d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko */
167d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko
177d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalkopackage com.android.tv.onboarding;
187d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko
197d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalkoimport android.app.Fragment;
207d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalkoimport android.content.Context;
217d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalkoimport android.content.Intent;
22ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport android.content.pm.PackageManager;
23ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport android.os.Build;
247d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalkoimport android.os.Bundle;
257d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalkoimport android.support.annotation.NonNull;
267d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalkoimport android.widget.Toast;
277d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko
287d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalkoimport com.android.tv.R;
291abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport com.android.tv.TvApplication;
30ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport com.android.tv.common.ui.setup.SetupActivity;
31ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport com.android.tv.common.ui.setup.SetupMultiPaneFragment;
321abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport com.android.tv.data.ChannelDataManager;
337d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalkoimport com.android.tv.util.OnboardingUtils;
34ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkoimport com.android.tv.util.PermissionUtils;
357d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalkoimport com.android.tv.util.SetupUtils;
367d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko
37ba5845f23b8fbc985890f892961abc8b39886611Nick Chalkopublic class OnboardingActivity extends SetupActivity {
38ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    private static final String KEY_INTENT_AFTER_COMPLETION = "key_intent_after_completion";
397d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko
40ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    private static final int PERMISSIONS_REQUEST_READ_TV_LISTINGS = 1;
41ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    private static final String PERMISSION_READ_TV_LISTINGS = "android.permission.READ_TV_LISTINGS";
427d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko
43ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    private static final int SHOW_RIPPLE_DURATION_MS = 266;
447d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko
45ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    private ChannelDataManager mChannelDataManager;
46ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    private final ChannelDataManager.Listener mChannelListener = new ChannelDataManager.Listener() {
47ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        @Override
48ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        public void onLoadFinished() {
49ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            mChannelDataManager.removeListener(this);
50ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            SetupUtils.getInstance(OnboardingActivity.this).markNewChannelsBrowsable();
51ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        }
527d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko
53ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        @Override
54ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        public void onChannelListUpdated() { }
557d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko
56ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        @Override
57ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        public void onChannelBrowsableChanged() { }
58ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    };
597d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko
607d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko    /**
617d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko     * Returns an intent to start {@link OnboardingActivity}.
627d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko     *
637d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko     * @param context context to create an intent. Should not be {@code null}.
647d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko     * @param intentAfterCompletion intent which will be used to start a new activity when this
657d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko     * activity finishes. Should not be {@code null}.
667d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko     */
677d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko    public static Intent buildIntent(@NonNull Context context,
687d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko            @NonNull Intent intentAfterCompletion) {
697d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko        return new Intent(context, OnboardingActivity.class)
707d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko                .putExtra(OnboardingActivity.KEY_INTENT_AFTER_COMPLETION, intentAfterCompletion);
717d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko    }
727d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko
737d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko    @Override
747d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko    protected void onCreate(Bundle savedInstanceState) {
757d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko        super.onCreate(savedInstanceState);
7648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        if (!PermissionUtils.hasAccessAllEpg(this)) {
7748dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
7848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                Toast.makeText(this, R.string.msg_not_supported_device, Toast.LENGTH_LONG).show();
7948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                finish();
8048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                return;
8148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            } else if (checkSelfPermission(PERMISSION_READ_TV_LISTINGS)
8248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                    != PackageManager.PERMISSION_GRANTED) {
8348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                requestPermissions(new String[]{PERMISSION_READ_TV_LISTINGS},
8448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                        PERMISSIONS_REQUEST_READ_TV_LISTINGS);
8548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            }
867d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko        }
877d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko    }
887d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko
897d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko    @Override
907d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko    protected void onDestroy() {
9148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        if (mChannelDataManager != null) {
9248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            mChannelDataManager.removeListener(mChannelListener);
9348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        }
947d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko        super.onDestroy();
957d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko    }
967d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko
97ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    @Override
98ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected Fragment onCreateInitialFragment() {
9948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        if (PermissionUtils.hasAccessAllEpg(this) || PermissionUtils.hasReadTvListings(this)) {
10048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            // Make the channels of the new inputs which have been setup outside Live TV
10148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            // browsable.
10248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            mChannelDataManager = TvApplication.getSingletons(this).getChannelDataManager();
10348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            if (mChannelDataManager.isDbLoadFinished()) {
10448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                SetupUtils.getInstance(this).markNewChannelsBrowsable();
10548dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            } else {
10648dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                mChannelDataManager.addListener(mChannelListener);
107ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            }
10848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            return OnboardingUtils.isFirstRunWithCurrentVersion(this) ? new WelcomeFragment()
10948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                    : new SetupSourcesFragment();
1101abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        }
11148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho        return null;
1121abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
1137d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko
114ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    @Override
115ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
116ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            @NonNull int[] grantResults) {
117ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        if (requestCode == PERMISSIONS_REQUEST_READ_TV_LISTINGS) {
11848dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            if (grantResults != null && grantResults.length > 0
11948dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
12048dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                finish();
12148dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                Intent intentForNextActivity = getIntent().getParcelableExtra(
12248dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                        KEY_INTENT_AFTER_COMPLETION);
12348dadb49248271b01997862e1335912a4f2e189fYoungsang Cho                startActivity(buildIntent(this, intentForNextActivity));
12448dadb49248271b01997862e1335912a4f2e189fYoungsang Cho            } else {
125ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                Toast.makeText(this, R.string.msg_read_tv_listing_permission_denied,
126ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                        Toast.LENGTH_LONG).show();
127ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                finish();
1287d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko            }
1297d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko        }
1307d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko    }
1311abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
1327d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko    void finishActivity() {
1331abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        Intent intentForNextActivity = getIntent().getParcelableExtra(
1347d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko                KEY_INTENT_AFTER_COMPLETION);
1357d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko        if (intentForNextActivity != null) {
1367d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko            startActivity(intentForNextActivity);
1377d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko        }
1387d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko        finish();
1397d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko    }
1407d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko
141ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    void showMerchantCollection() {
142ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        executeActionWithDelay(new Runnable() {
143ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            @Override
144ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            public void run() {
145ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                startActivity(OnboardingUtils.PLAY_STORE_INTENT);
1467d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko            }
147ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        }, SHOW_RIPPLE_DURATION_MS);
1487d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko    }
1497d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko
150ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    @Override
151ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    protected void executeAction(String category, int actionId) {
152ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko        switch (category) {
153ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            case WelcomeFragment.ACTION_CATEGORY:
154ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                switch (actionId) {
155ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                    case WelcomeFragment.ACTION_NEXT:
156ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                        OnboardingUtils.setFirstRunWithCurrentVersionCompleted(
157ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                                OnboardingActivity.this);
158ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                        showFragment(new SetupSourcesFragment(), false);
159ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                        break;
1601abddd9f6225298066094e20a6c29061b6af4590Nick Chalko                }
161ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                break;
162ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko            case SetupSourcesFragment.ACTION_CATEGORY:
163ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                switch (actionId) {
164ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                    case SetupSourcesFragment.ACTION_PLAY_STORE:
165ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                        showMerchantCollection();
166ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                        break;
167ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                    case SetupMultiPaneFragment.ACTION_DONE: {
168ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                        ChannelDataManager manager = TvApplication.getSingletons(
169ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                                OnboardingActivity.this).getChannelDataManager();
170ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                        if (manager.getChannelCount() == 0) {
171ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                            finish();
172ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                        } else {
173ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                            finishActivity();
1741abddd9f6225298066094e20a6c29061b6af4590Nick Chalko                        }
175ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                        break;
1761abddd9f6225298066094e20a6c29061b6af4590Nick Chalko                    }
1771abddd9f6225298066094e20a6c29061b6af4590Nick Chalko                }
178ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko                break;
1797d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko        }
1807d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko    }
1817d67089aa1e9aa2123c3cd2f386d7019a1544db1Nick Chalko}
182