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
onCreate(Bundle savedInstanceState)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
onCreateInitialFragment()66     protected Fragment onCreateInitialFragment() {
67         return new SetupSourcesFragment();
68     }
69 
showMerchantCollection()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
executeAction(String category, int actionId, Bundle params)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