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