• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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