1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.tv.setup; 18 19 import android.app.Activity; 20 import android.app.Fragment; 21 import android.content.ActivityNotFoundException; 22 import android.content.ComponentName; 23 import android.content.Intent; 24 import android.media.tv.TvInputInfo; 25 import android.os.Bundle; 26 import android.widget.Toast; 27 28 import com.android.tv.ApplicationSingletons; 29 import com.android.tv.R; 30 import com.android.tv.SetupPassthroughActivity; 31 import com.android.tv.common.TvCommonUtils; 32 import com.android.tv.common.ui.setup.SetupActivity; 33 import com.android.tv.common.ui.setup.SetupFragment; 34 import com.android.tv.common.ui.setup.SetupMultiPaneFragment; 35 import com.android.tv.TvApplication; 36 import com.android.tv.data.ChannelDataManager; 37 import com.android.tv.onboarding.SetupSourcesFragment; 38 import com.android.tv.util.OnboardingUtils; 39 import com.android.tv.util.SetupUtils; 40 import com.android.tv.util.TvInputManagerHelper; 41 42 /** 43 * A activity to start input sources setup fragment for initial setup flow. 44 */ 45 public class SystemSetupActivity extends SetupActivity { 46 private static final String SYSTEM_SETUP = 47 "com.android.tv.action.LAUNCH_SYSTEM_SETUP"; 48 private static final int SHOW_RIPPLE_DURATION_MS = 266; 49 private static final int REQUEST_CODE_START_SETUP_ACTIVITY = 1; 50 51 private TvInputManagerHelper mInputManager; 52 53 @Override 54 protected void onCreate(Bundle savedInstanceState) { 55 super.onCreate(savedInstanceState); 56 Intent intent = getIntent(); 57 if (!SYSTEM_SETUP.equals(intent.getAction())) { 58 finish(); 59 return; 60 } 61 ApplicationSingletons singletons = TvApplication.getSingletons(this); 62 mInputManager = singletons.getTvInputManagerHelper(); 63 } 64 65 @Override 66 protected Fragment onCreateInitialFragment() { 67 return new SetupSourcesFragment(); 68 } 69 70 private void showMerchantCollection() { 71 executeActionWithDelay(new Runnable() { 72 @Override 73 public void run() { 74 startActivity(OnboardingUtils.ONLINE_STORE_INTENT); 75 } 76 }, SHOW_RIPPLE_DURATION_MS); 77 } 78 79 @Override 80 public boolean executeAction(String category, int actionId, Bundle params) { 81 switch (category) { 82 case SetupSourcesFragment.ACTION_CATEGORY: 83 switch (actionId) { 84 case SetupSourcesFragment.ACTION_ONLINE_STORE: 85 showMerchantCollection(); 86 return true; 87 case SetupSourcesFragment.ACTION_SETUP_INPUT: { 88 String inputId = params.getString( 89 SetupSourcesFragment.ACTION_PARAM_KEY_INPUT_ID); 90 TvInputInfo input = mInputManager.getTvInputInfo(inputId); 91 Intent intent = TvCommonUtils.createSetupIntent(input); 92 if (intent == null) { 93 Toast.makeText(this, R.string.msg_no_setup_activity, Toast.LENGTH_SHORT) 94 .show(); 95 return true; 96 } 97 // Even though other app can handle the intent, the setup launched by Live 98 // channels should go through Live channels SetupPassthroughActivity. 99 intent.setComponent(new ComponentName(this, 100 SetupPassthroughActivity.class)); 101 try { 102 // Now we know that the user intends to set up this input. Grant 103 // permission for writing EPG data. 104 SetupUtils.grantEpgPermission(this, input.getServiceInfo().packageName); 105 startActivityForResult(intent, REQUEST_CODE_START_SETUP_ACTIVITY); 106 } catch (ActivityNotFoundException e) { 107 Toast.makeText(this, 108 getString(R.string.msg_unable_to_start_setup_activity, 109 input.loadLabel(this)), Toast.LENGTH_SHORT).show(); 110 } 111 return true; 112 } 113 case SetupMultiPaneFragment.ACTION_DONE: { 114 // To make sure user can finish setup flow, set result as RESULT_OK. 115 setResult(Activity.RESULT_OK); 116 finish(); 117 return true; 118 } 119 } 120 break; 121 } 122 return false; 123 } 124 } 125