1 /* 2 * Copyright (C) 2017 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 package com.android.car.settings.wifi; 17 18 import android.net.wifi.WifiConfiguration; 19 import android.net.wifi.WifiManager; 20 import android.os.Bundle; 21 import android.widget.Button; 22 import android.widget.EditText; 23 import android.widget.TextView; 24 import android.widget.Toast; 25 import android.widget.ViewSwitcher; 26 27 import com.android.car.settings.common.CarSettingActivity; 28 import com.android.car.settings.R; 29 import com.android.settingslib.wifi.AccessPoint; 30 31 import java.util.regex.Pattern; 32 33 /** 34 * Adds a wifi network, the network can be public or private. If ADD_NETWORK_MODE is not specified 35 * in the intent, then it needs to contain AccessPoint information, which is be use that to 36 * render UI, e.g. show SSID etc. 37 */ 38 public class AddWifiActivity extends CarSettingActivity { 39 public static final String ADD_NETWORK_MODE = "addNetworkMode"; 40 private static final String TAG = "AddWifiActivity"; 41 private static final Pattern HEX_PATTERN = Pattern.compile("^[0-9A-F]+$"); 42 private AccessPoint mAccessPoint; 43 private WifiManager mWifiManager; 44 private final WifiManager.ActionListener mConnectionListener = new WifiManager.ActionListener() { 45 @Override 46 public void onSuccess() { 47 } 48 49 @Override 50 public void onFailure(int reason) { 51 Toast.makeText(AddWifiActivity.this, 52 R.string.wifi_failed_connect_message, 53 Toast.LENGTH_SHORT).show(); 54 } 55 }; 56 // Switch between display a ssid and entering ssid. 57 private ViewSwitcher mSSidViewSwitcher; 58 private TextView mWifiNameDisplay; 59 private EditText mWifiNameInput; 60 private boolean mAddNetworkMode; 61 private EditText mWifiPasswordInput; 62 63 @Override onCreate(Bundle savedInstanceState)64 protected void onCreate(Bundle savedInstanceState) { 65 super.onCreate(savedInstanceState); 66 mWifiManager = (WifiManager) getSystemService(WifiManager.class); 67 68 setContentView(R.layout.add_wifi); 69 mSSidViewSwitcher = (ViewSwitcher) findViewById(R.id.wifi_name); 70 mWifiNameDisplay = (TextView) findViewById(R.id.wifi_name_display); 71 mWifiNameInput = (EditText) findViewById(R.id.wifi_name_input); 72 mWifiPasswordInput = (EditText) findViewById(R.id.wifi_password); 73 Button addWifiButton = (Button) findViewById(R.id.wifi_connect); 74 bootstrap(); 75 76 addWifiButton.setOnClickListener(v -> { 77 WifiConfiguration wifiConfig = new WifiConfiguration(); 78 wifiConfig.SSID = String.format("\"%s\"", getSsId()); 79 wifiConfig.preSharedKey = String.format( 80 "\"%s\"", mWifiPasswordInput.getText().toString()); 81 82 int netId = mWifiManager.addNetwork(wifiConfig); 83 mWifiManager.disconnect(); 84 mWifiManager.enableNetwork(netId, true); 85 mWifiManager.reconnect(); 86 finish(); 87 }); 88 } 89 connectToAccessPoint()90 private void connectToAccessPoint() { 91 WifiConfiguration wifiConfig = new WifiConfiguration(); 92 wifiConfig.SSID = String.format("\"%s\"", getSsId()); 93 wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); 94 wifiConfig.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); 95 wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN); 96 wifiConfig.allowedProtocols.set(WifiConfiguration.Protocol.WPA); 97 wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40); 98 wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104); 99 switch (mAccessPoint.getSecurity()) { 100 case AccessPoint.SECURITY_NONE: 101 wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 102 wifiConfig.allowedAuthAlgorithms.clear(); 103 wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 104 wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 105 case AccessPoint.SECURITY_WEP: 106 wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 107 wifiConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); 108 wifiConfig.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED); 109 String password = mWifiPasswordInput.getText().toString(); 110 wifiConfig.wepKeys[0] = isHexString(password) ? password : "\"" + password + "\""; 111 wifiConfig.wepTxKeyIndex = 0; 112 case AccessPoint.SECURITY_PSK: 113 case AccessPoint.SECURITY_EAP: 114 wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 115 wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 116 wifiConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 117 wifiConfig.preSharedKey = String.format( 118 "\"%s\"", mWifiPasswordInput.getText().toString()); 119 } 120 int netId = mWifiManager.addNetwork(wifiConfig); 121 if (netId != -1) { 122 mWifiManager.enableNetwork(netId, true); 123 } 124 } 125 isHexString(String password)126 private boolean isHexString(String password) { 127 return HEX_PATTERN.matcher(password).matches(); 128 } 129 130 // TODO: handle null case, show warning message etc. getSsId()131 private String getSsId() { 132 if (mAddNetworkMode) { 133 return mWifiNameInput.getText().toString(); 134 } else { 135 return mAccessPoint.getSsid().toString(); 136 } 137 } 138 139 /** 140 * Sets up fields based on Intent content, and setup UI accordingly. 141 */ bootstrap()142 private void bootstrap() { 143 Bundle bundle = getIntent().getExtras(); 144 if (bundle == null) { 145 return; 146 } 147 if (bundle.containsKey(ADD_NETWORK_MODE)) { 148 mAddNetworkMode = true; 149 } else { 150 mAccessPoint = new AccessPoint(this, bundle); 151 } 152 if (mAddNetworkMode && mSSidViewSwitcher.getCurrentView() == mWifiNameDisplay) { 153 mSSidViewSwitcher.showNext(); 154 } 155 if (!mAddNetworkMode) { 156 mWifiNameDisplay.setText(mAccessPoint.getSsid()); 157 } 158 } 159 } 160