• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2018 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.settings.wifi;
18 
19 import android.app.Activity;
20 import android.app.settings.SettingsEnums;
21 import android.content.Intent;
22 import android.net.wifi.WifiConfiguration;
23 import android.net.wifi.WifiManager;
24 import android.os.Bundle;
25 import android.view.LayoutInflater;
26 import android.view.View;
27 import android.view.ViewGroup;
28 import android.view.WindowManager;
29 import android.widget.Button;
30 import android.widget.ImageButton;
31 import android.widget.TextView;
32 import android.widget.Toast;
33 
34 import androidx.annotation.VisibleForTesting;
35 
36 import com.android.settings.R;
37 import com.android.settings.core.InstrumentedFragment;
38 import com.android.settings.wifi.dpp.WifiDppQrCodeScannerFragment;
39 import com.android.settings.wifi.dpp.WifiDppUtils;
40 
41 /**
42  * A full screen UI component for users to edit and add a Wi-Fi network.
43  */
44 public class AddNetworkFragment extends InstrumentedFragment implements WifiConfigUiBase2,
45         View.OnClickListener {
46 
47     public static final String WIFI_CONFIG_KEY = "wifi_config_key";
48     @VisibleForTesting
49     final static int SUBMIT_BUTTON_ID = android.R.id.button1;
50     @VisibleForTesting
51     final static int CANCEL_BUTTON_ID = android.R.id.button2;
52     final static int SSID_SCANNER_BUTTON_ID = R.id.ssid_scanner_button;
53 
54     private static final int REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER = 0;
55 
56     private static final String EXTRA_SAVE_WHEN_SUBMIT = ":settings:save_when_submit";
57 
58     private WifiConfigController2 mUIController;
59     private Button mSubmitBtn;
60     private Button mCancelBtn;
61 
62     @Override
onCreate(Bundle savedInstanceState)63     public void onCreate(Bundle savedInstanceState) {
64         super.onCreate(savedInstanceState);
65     }
66 
67     @Override
getMetricsCategory()68     public int getMetricsCategory() {
69         return SettingsEnums.SETTINGS_WIFI_ADD_NETWORK;
70     }
71 
72     @Override
onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)73     public View onCreateView(LayoutInflater inflater, ViewGroup container,
74             Bundle savedInstanceState) {
75         final View rootView = inflater.inflate(R.layout.wifi_add_network_view, container, false);
76 
77         final Button neutral = rootView.findViewById(android.R.id.button3);
78         if (neutral != null) {
79             neutral.setVisibility(View.GONE);
80         }
81 
82         mSubmitBtn = rootView.findViewById(SUBMIT_BUTTON_ID);
83         mCancelBtn = rootView.findViewById(CANCEL_BUTTON_ID);
84         final ImageButton ssidScannerButton = rootView.findViewById(SSID_SCANNER_BUTTON_ID);
85         mSubmitBtn.setOnClickListener(this);
86         mCancelBtn.setOnClickListener(this);
87         ssidScannerButton.setOnClickListener(this);
88         mUIController = new WifiConfigController2(this, rootView, null, getMode());
89 
90         // Resize the layout when keyboard opens.
91         getActivity().getWindow().setSoftInputMode(
92                 WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
93 
94         return rootView;
95     }
96 
97     @Override
onResume()98     public void onResume() {
99         super.onResume();
100         mUIController.showSecurityFields(
101             /* refreshEapMethods */ false, /* refreshCertificates */ true);
102     }
103 
104     @Override
onViewStateRestored(Bundle savedInstanceState)105     public void onViewStateRestored(Bundle savedInstanceState) {
106         super.onViewStateRestored(savedInstanceState);
107         mUIController.updatePassword();
108     }
109 
110     @Override
onClick(View view)111     public void onClick(View view) {
112         if (view.getId() == SUBMIT_BUTTON_ID) {
113             handleSubmitAction();
114         } else if (view.getId() == CANCEL_BUTTON_ID) {
115             handleCancelAction();
116         } else if (view.getId() == SSID_SCANNER_BUTTON_ID) {
117             final TextView ssidEditText = getView().findViewById(R.id.ssid);
118             final String ssid = ssidEditText.getText().toString();
119 
120             // Launch QR code scanner to join a network.
121             startActivityForResult(
122                     WifiDppUtils.getEnrolleeQrCodeScannerIntent(view.getContext(), ssid),
123                     REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER);
124         }
125     }
126 
127     @Override
onActivityResult(int requestCode, int resultCode, Intent data)128     public void onActivityResult(int requestCode, int resultCode, Intent data) {
129         super.onActivityResult(requestCode, resultCode, data);
130         if (requestCode == REQUEST_CODE_WIFI_DPP_ENROLLEE_QR_CODE_SCANNER) {
131             if (resultCode != Activity.RESULT_OK) {
132                 return;
133             }
134 
135             final WifiConfiguration config = data.getParcelableExtra(
136                     WifiDppQrCodeScannerFragment.KEY_WIFI_CONFIGURATION);
137             successfullyFinish(config);
138         }
139     }
140 
141     @Override
getMode()142     public int getMode() {
143         return WifiConfigUiBase2.MODE_CONNECT;
144     }
145 
146     @Override
getController()147     public WifiConfigController2 getController() {
148         return mUIController;
149     }
150 
151     @Override
dispatchSubmit()152     public void dispatchSubmit() {
153         handleSubmitAction();
154     }
155 
156     @Override
setTitle(int id)157     public void setTitle(int id) {
158         getActivity().setTitle(id);
159     }
160 
161     @Override
setTitle(CharSequence title)162     public void setTitle(CharSequence title) {
163         getActivity().setTitle(title);
164     }
165 
166     @Override
setSubmitButton(CharSequence text)167     public void setSubmitButton(CharSequence text) {
168         mSubmitBtn.setText(text);
169     }
170 
171     @Override
setCancelButton(CharSequence text)172     public void setCancelButton(CharSequence text) {
173         mCancelBtn.setText(text);
174     }
175 
176     @Override
setForgetButton(CharSequence text)177     public void setForgetButton(CharSequence text) {
178         // AddNetwork doesn't need forget button.
179     }
180 
181     @Override
getSubmitButton()182     public Button getSubmitButton() {
183         return mSubmitBtn;
184     }
185 
186     @Override
getCancelButton()187     public Button getCancelButton() {
188         return mCancelBtn;
189     }
190 
191     @Override
getForgetButton()192     public Button getForgetButton() {
193         // AddNetwork doesn't need forget button.
194         return null;
195     }
196 
197     @VisibleForTesting
handleSubmitAction()198     void handleSubmitAction() {
199         successfullyFinish(mUIController.getConfig());
200     }
201 
successfullyFinish(WifiConfiguration config)202     private void successfullyFinish(WifiConfiguration config) {
203         Activity activity = getActivity();
204         boolean autoSave = activity.getIntent().getBooleanExtra(EXTRA_SAVE_WHEN_SUBMIT, false);
205         if (autoSave && config != null) {
206             WifiManager.ActionListener saveListener = new WifiManager.ActionListener() {
207                 @Override
208                 public void onSuccess() {
209                     if (activity != null && !activity.isFinishing()) {
210                         activity.setResult(Activity.RESULT_OK);
211                         activity.finish();
212                     }
213                 }
214 
215                 @Override
216                 public void onFailure(int reason) {
217                     if (activity != null && !activity.isFinishing()) {
218                         Toast.makeText(activity, R.string.wifi_failed_save_message,
219                                 Toast.LENGTH_SHORT).show();
220                         activity.finish();
221                     }
222                 }
223             };
224 
225             activity.getSystemService(WifiManager.class).save(config, saveListener);
226         } else {
227             Intent intent = new Intent();
228             intent.putExtra(WIFI_CONFIG_KEY, config);
229             activity.setResult(Activity.RESULT_OK, intent);
230             activity.finish();
231         }
232     }
233 
234     @VisibleForTesting
handleCancelAction()235     void handleCancelAction() {
236         final Activity activity = getActivity();
237         activity.setResult(Activity.RESULT_CANCELED);
238         activity.finish();
239     }
240 }
241