1 /* 2 * Copyright (C) 2014 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.settings.connectivity; 18 19 import android.app.Fragment; 20 import android.app.FragmentTransaction; 21 import android.content.Context; 22 import android.net.wifi.WifiManager; 23 import android.net.wifi.WifiManager.WpsCallback; 24 import android.net.wifi.WpsInfo; 25 import android.os.Bundle; 26 27 import com.android.tv.settings.R; 28 import com.android.tv.settings.connectivity.setup.SelectFromListWizardFragment; 29 import com.android.tv.settings.dialog.old.DialogActivity; 30 import com.android.tv.settings.util.ThemeHelper; 31 32 import java.util.ArrayList; 33 34 public class WpsConnectionActivity extends DialogActivity 35 implements SelectFromListWizardFragment.Listener, TimedMessageWizardFragment.Listener { 36 37 private static final String WPS_FRAGMENT_TAG = "wps_fragment_tag"; 38 39 private WifiManager mWifiManager; 40 private boolean mWpsComplete; 41 private boolean mActive; 42 43 private final WpsCallback mWpsCallback = new WpsCallback() { 44 @Override 45 public void onStarted(String pin) { 46 if (pin != null && mActive) { 47 displayFragment(createEnterPinFragment(pin), true); 48 } 49 } 50 51 @Override 52 public void onSucceeded() { 53 mWpsComplete = true; 54 55 if (!mActive) { 56 return; 57 } 58 59 displayFragment(createSuccessFragment(), true); 60 } 61 62 @Override 63 public void onFailed(int reason) { 64 mWpsComplete = true; 65 66 if (!mActive) { 67 return; 68 } 69 70 String errorMessage; 71 switch (reason) { 72 case WifiManager.WPS_OVERLAP_ERROR: 73 errorMessage = getString(R.string.wifi_wps_failed_overlap); 74 break; 75 case WifiManager.WPS_WEP_PROHIBITED: 76 errorMessage = getString(R.string.wifi_wps_failed_wep); 77 break; 78 case WifiManager.WPS_TKIP_ONLY_PROHIBITED: 79 errorMessage = getString(R.string.wifi_wps_failed_tkip); 80 break; 81 case WifiManager.IN_PROGRESS: 82 mWifiManager.cancelWps(null); 83 startWps(); 84 return; 85 case WifiManager.WPS_TIMED_OUT: 86 startWps(); 87 return; 88 default: 89 errorMessage = getString(R.string.wifi_wps_failed_generic); 90 break; 91 } 92 displayFragment(createErrorFragment(errorMessage), true); 93 } 94 }; 95 96 @Override onCreate(Bundle savedInstanceState)97 protected void onCreate(Bundle savedInstanceState) { 98 setTheme(ThemeHelper.getThemeResource(getIntent())); 99 setLayoutProperties(R.layout.setup_auth_activity, R.id.description, R.id.action); 100 super.onCreate(savedInstanceState); 101 mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 102 103 if (ThemeHelper.fromSetupWizard(getIntent())) { 104 setTitle(getResources().getString(R.string.wifi_wps_title)); 105 } 106 } 107 108 @Override onStart()109 protected void onStart() { 110 super.onStart(); 111 // Must be set before all other actions. 112 mActive = true; 113 114 startWps(); 115 } 116 117 @Override onStop()118 protected void onStop() { 119 super.onStop(); 120 mActive = false; 121 122 if (!mWpsComplete) { 123 mWifiManager.cancelWps(null); 124 } 125 } 126 127 @Override onTimedMessageCompleted()128 public void onTimedMessageCompleted() { 129 setResult(RESULT_OK); 130 finish(); 131 } 132 133 @Override onListSelectionComplete(SelectFromListWizardFragment.ListItem listItem)134 public void onListSelectionComplete(SelectFromListWizardFragment.ListItem listItem) { 135 startWps(); 136 } 137 138 @Override onListFocusChanged(SelectFromListWizardFragment.ListItem listItem)139 public void onListFocusChanged(SelectFromListWizardFragment.ListItem listItem) { 140 // Do nothing. 141 } 142 startWps()143 private void startWps() { 144 Fragment currentFragment = getFragmentManager().findFragmentByTag(WPS_FRAGMENT_TAG); 145 if (!(currentFragment instanceof WpsScanningFragment)) { 146 displayFragment(createWpsScanningFragment(), true); 147 } 148 mWpsComplete = false; 149 WpsInfo wpsConfig = new WpsInfo(); 150 wpsConfig.setup = WpsInfo.PBC; 151 mWifiManager.startWps(wpsConfig, mWpsCallback); 152 } 153 createWpsScanningFragment()154 private Fragment createWpsScanningFragment() { 155 return WpsScanningFragment.newInstance(); 156 } 157 createEnterPinFragment(String pin)158 private Fragment createEnterPinFragment(String pin) { 159 return WpsPinFragment.newInstance(pin); 160 } 161 createErrorFragment(String errorMessage)162 private Fragment createErrorFragment(String errorMessage) { 163 SelectFromListWizardFragment.ListItem retryListItem = 164 new SelectFromListWizardFragment.ListItem( 165 getString(R.string.wifi_wps_retry_scan), 0); 166 ArrayList<SelectFromListWizardFragment.ListItem> listItems = new ArrayList<>(); 167 listItems.add(retryListItem); 168 return SelectFromListWizardFragment.newInstance(errorMessage, null, listItems, 169 retryListItem); 170 } 171 createSuccessFragment()172 private Fragment createSuccessFragment() { 173 return TimedMessageWizardFragment.newInstance( 174 getString(R.string.wifi_setup_connection_success)); 175 } 176 displayFragment(Fragment fragment, boolean forward)177 private void displayFragment(Fragment fragment, boolean forward) { 178 FragmentTransaction transaction = getFragmentManager().beginTransaction(); 179 if (forward) { 180 transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 181 } else { 182 transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 183 } 184 transaction.replace(R.id.content, fragment, WPS_FRAGMENT_TAG).commit(); 185 } 186 } 187