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