• 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.annotation.NonNull;
19 import android.annotation.StringRes;
20 import android.car.drivingstate.CarUxRestrictions;
21 import android.net.wifi.WifiManager;
22 import android.os.Bundle;
23 import android.view.View;
24 import android.widget.ProgressBar;
25 import android.widget.Switch;
26 import android.widget.TextView;
27 import android.widget.ViewSwitcher;
28 
29 import androidx.car.widget.PagedListView;
30 
31 import com.android.car.settings.R;
32 import com.android.car.settings.common.BaseFragment;
33 import com.android.car.settings.common.CarUxRestrictionsHelper;
34 
35 /**
36  * Main page to host Wifi related preferences.
37  */
38 public class WifiSettingsFragment extends BaseFragment implements CarWifiManager.Listener {
39     private CarWifiManager mCarWifiManager;
40     private AccessPointListAdapter mAdapter;
41     private Switch mWifiSwitch;
42     private ProgressBar mProgressBar;
43     private PagedListView mListView;
44     private TextView mMessageView;
45     private ViewSwitcher mViewSwitcher;
46     private boolean mShowSavedApOnly;
47 
48     /**
49      * Gets a new instance of this object.
50      */
newInstance()51     public static WifiSettingsFragment newInstance() {
52         WifiSettingsFragment wifiSettingsFragment = new WifiSettingsFragment();
53         Bundle bundle = BaseFragment.getBundle();
54         bundle.putInt(EXTRA_TITLE_ID, R.string.wifi_settings);
55         bundle.putInt(EXTRA_LAYOUT, R.layout.wifi_list);
56         bundle.putInt(EXTRA_ACTION_BAR_LAYOUT, R.layout.action_bar_with_toggle);
57         wifiSettingsFragment.setArguments(bundle);
58         return wifiSettingsFragment;
59     }
60 
61     /**
62      * Shows only saved wifi network.
63      */
showSavedApOnly(boolean showSavedApOnly)64     public WifiSettingsFragment showSavedApOnly(boolean showSavedApOnly) {
65         mShowSavedApOnly = showSavedApOnly;
66         return this;
67     }
68 
69     @Override
onActivityCreated(Bundle savedInstanceState)70     public void onActivityCreated(Bundle savedInstanceState) {
71         super.onActivityCreated(savedInstanceState);
72         mCarWifiManager = new CarWifiManager(getContext(), /* listener= */ this);
73 
74         mProgressBar = (ProgressBar) getView().findViewById(R.id.wifi_search_progress);
75         mListView = (PagedListView) getView().findViewById(R.id.list);
76         mMessageView = (TextView) getView().findViewById(R.id.message);
77         mViewSwitcher = (ViewSwitcher) getView().findViewById(R.id.view_switcher);
78         setupWifiSwitch();
79         if (mCarWifiManager.isWifiEnabled()) {
80             showList();
81             setProgressBarVisible(true);
82         } else {
83             showMessage(R.string.wifi_disabled);
84         }
85         mAdapter = new AccessPointListAdapter(
86                 getContext(),
87                 mCarWifiManager,
88                 mShowSavedApOnly
89                         ? mCarWifiManager.getSavedAccessPoints()
90                         : mCarWifiManager.getAllAccessPoints(),
91                 getFragmentController());
92         mAdapter.showAddNetworkRow(!mShowSavedApOnly);
93         mListView.setAdapter(mAdapter);
94     }
95 
96     @Override
onStart()97     public void onStart() {
98         super.onStart();
99         mCarWifiManager.start();
100     }
101 
102     @Override
onStop()103     public void onStop() {
104         super.onStop();
105         mCarWifiManager.stop();
106     }
107 
108     @Override
onDestroy()109     public void onDestroy() {
110         super.onDestroy();
111         mCarWifiManager.destroy();
112     }
113 
114     @Override
onAccessPointsChanged()115     public void onAccessPointsChanged() {
116         refreshData();
117     }
118 
119     @Override
onWifiStateChanged(int state)120     public void onWifiStateChanged(int state) {
121         mWifiSwitch.setChecked(mCarWifiManager.isWifiEnabled());
122         switch (state) {
123             case WifiManager.WIFI_STATE_ENABLING:
124                 showList();
125                 setProgressBarVisible(true);
126                 break;
127             case WifiManager.WIFI_STATE_DISABLED:
128                 setProgressBarVisible(false);
129                 showMessage(R.string.wifi_disabled);
130                 break;
131             default:
132                 showList();
133         }
134     }
135 
136     /**
137      * This fragment will adapt to restriction, so can always be shown.
138      */
139     @Override
canBeShown(CarUxRestrictions carUxRestrictions)140     public boolean canBeShown(CarUxRestrictions carUxRestrictions) {
141         return true;
142     }
143 
144     @Override
onUxRestrictionChanged(@onNull CarUxRestrictions carUxRestrictions)145     public void onUxRestrictionChanged(@NonNull CarUxRestrictions carUxRestrictions) {
146         mShowSavedApOnly = CarUxRestrictionsHelper.isNoSetup(carUxRestrictions);
147         refreshData();
148     }
149 
setProgressBarVisible(boolean visible)150     private  void setProgressBarVisible(boolean visible) {
151         if (mProgressBar != null) {
152             mProgressBar.setVisibility(visible ? View.VISIBLE : View.GONE);
153         }
154     }
155 
refreshData()156     private void refreshData() {
157         if (mAdapter != null) {
158             mAdapter.showAddNetworkRow(!mShowSavedApOnly);
159             mAdapter.updateAccessPoints(mShowSavedApOnly
160                     ? mCarWifiManager.getSavedAccessPoints()
161                     : mCarWifiManager.getAllAccessPoints());
162             // if the list is empty, keep showing the progress bar, the list should reset
163             // every couple seconds.
164             // TODO: Consider show a message in the list view place.
165             if (!mAdapter.isEmpty()) {
166                 setProgressBarVisible(false);
167             }
168         }
169         if (mCarWifiManager != null) {
170             mWifiSwitch.setChecked(mCarWifiManager.isWifiEnabled());
171         }
172     }
173 
showMessage(@tringRes int resId)174     private void showMessage(@StringRes int resId) {
175         if (mViewSwitcher.getCurrentView() != mMessageView) {
176             mViewSwitcher.showNext();
177         }
178         mMessageView.setText(getResources().getString(resId));
179     }
180 
showList()181     private void showList() {
182         if (mViewSwitcher.getCurrentView() != mListView) {
183             mViewSwitcher.showPrevious();
184         }
185     }
186 
setupWifiSwitch()187     private void setupWifiSwitch() {
188         mWifiSwitch = (Switch) getActivity().findViewById(R.id.toggle_switch);
189         mWifiSwitch.setChecked(mCarWifiManager.isWifiEnabled());
190         mWifiSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
191             if (mWifiSwitch.isChecked() != mCarWifiManager.isWifiEnabled()) {
192                 mCarWifiManager.setWifiEnabled(mWifiSwitch.isChecked());
193             }
194         });
195     }
196 }
197