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