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