• 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.NetworkInfo.State;
19 import android.net.wifi.WifiManager;
20 import android.os.Bundle;
21 import android.support.annotation.StringRes;
22 import android.support.v7.app.AppCompatActivity;
23 import android.util.Log;
24 import android.view.View;
25 import android.widget.TextView;
26 import android.widget.Toast;
27 
28 import com.android.car.settings.common.ListSettingsFragment;
29 import com.android.car.settings.common.SimpleTextLineItem;
30 import com.android.car.settings.common.TypedPagedListAdapter;
31 import com.android.settingslib.wifi.AccessPoint;
32 
33 import com.android.car.settings.R;
34 
35 import java.util.ArrayList;
36 
37 /**
38  * Shows details about a wifi network, including actions related to the network,
39  * e.g. ignore, disconnect, etc. The intent should include information about
40  * access point, use that to render UI, e.g. show SSID etc.
41  */
42 public class WifiDetailFragment extends ListSettingsFragment {
43     public static final String EXTRA_AP_STATE = "extra_ap_state";
44     private static final String TAG = "WifiDetailFragment";
45 
46     private AccessPoint mAccessPoint;
47     private WifiManager mWifiManager;
48 
49     private class ActionFailListener implements WifiManager.ActionListener {
50         @StringRes private final int mMessageResId;
51 
ActionFailListener(@tringRes int messageResId)52         public ActionFailListener(@StringRes int messageResId) {
53             mMessageResId = messageResId;
54         }
55 
56         @Override
onSuccess()57         public void onSuccess() {
58         }
59         @Override
onFailure(int reason)60         public void onFailure(int reason) {
61             Toast.makeText(getContext(),
62                     R.string.wifi_failed_connect_message,
63                     Toast.LENGTH_SHORT).show();
64         }
65     }
66 
getInstance(AccessPoint accessPoint)67     public static WifiDetailFragment getInstance(AccessPoint accessPoint) {
68         WifiDetailFragment wifiDetailFragment = new WifiDetailFragment();
69         Bundle bundle = ListSettingsFragment.getBundle();
70         bundle.putInt(EXTRA_TITLE_ID, R.string.wifi_settings);
71         bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_button);
72         Bundle accessPointState = new Bundle();
73         accessPoint.saveWifiState(accessPointState);
74         bundle.putBundle(EXTRA_AP_STATE, accessPointState);
75         wifiDetailFragment.setArguments(bundle);
76         return wifiDetailFragment;
77     }
78 
79     @Override
onCreate(Bundle savedInstanceState)80     public void onCreate(Bundle savedInstanceState) {
81         super.onCreate(savedInstanceState);
82         mAccessPoint = new AccessPoint(getContext(), getArguments().getBundle(EXTRA_AP_STATE));
83     }
84 
85     @Override
onActivityCreated(Bundle savedInstanceState)86     public void onActivityCreated(Bundle savedInstanceState) {
87         mWifiManager = getContext().getSystemService(WifiManager.class);
88 
89         super.onActivityCreated(savedInstanceState);
90         ((TextView) getActivity().findViewById(R.id.title)).setText(mAccessPoint.getSsid());
91         TextView forgetButton = (TextView) getActivity().findViewById(R.id.action_button1);
92         forgetButton.setText(R.string.forget);
93         forgetButton.setOnClickListener(v -> {
94                 forget();
95                 mFragmentController.goBack();
96             });
97 
98         if (mAccessPoint.isSaved() && !mAccessPoint.isActive()) {
99             TextView connectButton = (TextView) getActivity().findViewById(R.id.action_button2);
100             connectButton.setVisibility(View.VISIBLE);
101             connectButton.setText(R.string.wifi_setup_connect);
102             connectButton.setOnClickListener(v -> {
103                 mWifiManager.connect(mAccessPoint.getConfig(),
104                         new ActionFailListener(R.string.wifi_failed_connect_message));
105                 mFragmentController.goBack();
106             });
107         }
108     }
109 
110     @Override
getLineItems()111     public ArrayList<TypedPagedListAdapter.LineItem> getLineItems() {
112         ArrayList<TypedPagedListAdapter.LineItem> lineItems = new ArrayList<>();
113         lineItems.add(
114                 new SimpleTextLineItem(getText(R.string.wifi_status), mAccessPoint.getSummary()));
115         lineItems.add(
116                 new SimpleTextLineItem(getText(R.string.wifi_signal), getSignalString()));
117         lineItems.add(new SimpleTextLineItem(getText(R.string.wifi_security),
118                 mAccessPoint.getSecurityString(true /* concise*/)));
119         return lineItems;
120     }
121 
getSignalString()122     private String getSignalString() {
123         String[] signalStrings = getResources().getStringArray(R.array.wifi_signals);
124 
125         int level = WifiManager.calculateSignalLevel(
126                 mAccessPoint.getRssi(), signalStrings.length);
127         return signalStrings[level];
128     }
129 
forget()130     private void forget() {
131         if (!mAccessPoint.isSaved()) {
132             if (mAccessPoint.getNetworkInfo() != null &&
133                     mAccessPoint.getNetworkInfo().getState() != State.DISCONNECTED) {
134                 // Network is active but has no network ID - must be ephemeral.
135                 mWifiManager.disableEphemeralNetwork(
136                         AccessPoint.convertToQuotedString(mAccessPoint.getSsidStr()));
137             } else {
138                 // Should not happen, but a monkey seems to trigger it
139                 Log.e(TAG, "Failed to forget invalid network " + mAccessPoint.getConfig());
140                 return;
141             }
142         } else {
143             mWifiManager.forget(mAccessPoint.getConfig().networkId,
144                     new ActionFailListener(R.string.wifi_failed_forget_message));
145         }
146     }
147 }
148