Home | History | Annotate | Download | only in wifi
      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
     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 
     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 
    126     private boolean isHexString(String password) {
    127         return HEX_PATTERN.matcher(password).matches();
    128     }
    129 
    130     // TODO: handle null case, show warning message etc.
    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      */
    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