Add Wi-Fi hotspot > Security Settings page
- Restrict low security type when 6 GHz band is selected
- Disable "WPA2/WPA3-Personal" security type
- Disable "WPA2-Personal" security type
- Disable "None" security type
- Automatically updated security type to WPA3 when 6 GHz band is selected
- Regenerate password when security type is changed from None
Bug: 245258763
Test: manual test
atest -c WifiTetherSettingsTest
atest -c WifiTetherViewModelTest \
WifiHotspotSecuritySettingsTest \
WifiHotspotSecurityViewModelTest \
WifiHotspotRepositoryTest
Change-Id: I31b08795419baed10dc40b876aeec175f6f41e69
This commit is contained in:
@@ -0,0 +1,157 @@
|
||||
/*
|
||||
* Copyright (C) 2023 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package com.android.settings.wifi.tether;
|
||||
|
||||
import static android.net.wifi.SoftApConfiguration.SECURITY_TYPE_OPEN;
|
||||
import static android.net.wifi.SoftApConfiguration.SECURITY_TYPE_WPA2_PSK;
|
||||
import static android.net.wifi.SoftApConfiguration.SECURITY_TYPE_WPA3_SAE;
|
||||
import static android.net.wifi.SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION;
|
||||
|
||||
import static com.android.settings.wifi.repository.WifiHotspotRepository.SPEED_6GHZ;
|
||||
|
||||
import android.app.Application;
|
||||
|
||||
import androidx.lifecycle.AndroidViewModel;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.MutableLiveData;
|
||||
import androidx.lifecycle.Observer;
|
||||
|
||||
import com.android.settings.overlay.FeatureFactory;
|
||||
import com.android.settings.wifi.repository.WifiHotspotRepository;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Wi-Fi Hotspot Security View Model for {@link WifiHotspotSecuritySettings}
|
||||
*/
|
||||
public class WifiHotspotSecurityViewModel extends AndroidViewModel {
|
||||
private static final String TAG = "WifiHotspotSecurityViewModel";
|
||||
|
||||
public static final String KEY_SECURITY_WPA3 = "wifi_hotspot_security_wpa3";
|
||||
public static final String KEY_SECURITY_WPA2_WPA3 = "wifi_hotspot_security_wpa2_wpa3";
|
||||
public static final String KEY_SECURITY_WPA2 = "wifi_hotspot_security_wpa2";
|
||||
public static final String KEY_SECURITY_NONE = "wifi_hotspot_security_none";
|
||||
|
||||
protected Map<Integer, ViewItem> mViewItemMap = new HashMap<>();
|
||||
protected MutableLiveData<List<ViewItem>> mViewInfoListData;
|
||||
|
||||
protected final WifiHotspotRepository mWifiHotspotRepository;
|
||||
protected final Observer<Integer> mSecurityTypeObserver = st -> onSecurityTypeChanged(st);
|
||||
protected final Observer<Integer> mSpeedTypeObserver = st -> onSpeedTypeChanged(st);
|
||||
|
||||
public WifiHotspotSecurityViewModel(
|
||||
@NotNull Application application) {
|
||||
super(application);
|
||||
mViewItemMap.put(SECURITY_TYPE_WPA3_SAE, new ViewItem(KEY_SECURITY_WPA3));
|
||||
mViewItemMap.put(SECURITY_TYPE_WPA3_SAE_TRANSITION, new ViewItem(KEY_SECURITY_WPA2_WPA3));
|
||||
mViewItemMap.put(SECURITY_TYPE_WPA2_PSK, new ViewItem(KEY_SECURITY_WPA2));
|
||||
mViewItemMap.put(SECURITY_TYPE_OPEN, new ViewItem(KEY_SECURITY_NONE));
|
||||
|
||||
mWifiHotspotRepository = FeatureFactory.getFactory(application).getWifiFeatureProvider()
|
||||
.getWifiHotspotRepository();
|
||||
mWifiHotspotRepository.getSecurityType().observeForever(mSecurityTypeObserver);
|
||||
mWifiHotspotRepository.getSpeedType().observeForever(mSpeedTypeObserver);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCleared() {
|
||||
mWifiHotspotRepository.getSecurityType().removeObserver(mSecurityTypeObserver);
|
||||
mWifiHotspotRepository.getSpeedType().removeObserver(mSpeedTypeObserver);
|
||||
}
|
||||
|
||||
protected void onSecurityTypeChanged(int securityType) {
|
||||
log("onSecurityTypeChanged(), securityType:" + securityType);
|
||||
for (Map.Entry<Integer, ViewItem> entry : mViewItemMap.entrySet()) {
|
||||
entry.getValue().mIsChecked = entry.getKey().equals(securityType);
|
||||
}
|
||||
updateViewItemListData();
|
||||
}
|
||||
|
||||
protected void onSpeedTypeChanged(Integer speedType) {
|
||||
log("onSpeedTypeChanged(), speedType:" + speedType);
|
||||
boolean isWpa3Only = (speedType == SPEED_6GHZ);
|
||||
for (Map.Entry<Integer, ViewItem> entry : mViewItemMap.entrySet()) {
|
||||
if (entry.getKey() != SECURITY_TYPE_WPA3_SAE) {
|
||||
entry.getValue().mIsEnabled = !isWpa3Only;
|
||||
}
|
||||
}
|
||||
updateViewItemListData();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle RadioButton Clicked
|
||||
*/
|
||||
public void handleRadioButtonClicked(String key) {
|
||||
log("handleRadioButtonClicked(), key:" + key);
|
||||
for (Map.Entry<Integer, ViewItem> entry : mViewItemMap.entrySet()) {
|
||||
ViewItem viewItem = entry.getValue();
|
||||
if (viewItem.mKey.equals(key)) {
|
||||
mWifiHotspotRepository.setSecurityType(entry.getKey());
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets ViewItemList LiveData
|
||||
*/
|
||||
public LiveData<List<ViewItem>> getViewItemListData() {
|
||||
if (mViewInfoListData == null) {
|
||||
mViewInfoListData = new MutableLiveData<>();
|
||||
updateViewItemListData();
|
||||
log("getViewItemListData(), mViewInfoListData:" + mViewInfoListData.getValue());
|
||||
}
|
||||
return mViewInfoListData;
|
||||
}
|
||||
|
||||
protected void updateViewItemListData() {
|
||||
if (mViewInfoListData == null) {
|
||||
return;
|
||||
}
|
||||
mViewInfoListData.setValue(mViewItemMap.values().stream().toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* Wi-Fi Hotspot View Item
|
||||
*/
|
||||
public static final class ViewItem {
|
||||
String mKey;
|
||||
boolean mIsChecked;
|
||||
boolean mIsEnabled = true;
|
||||
|
||||
public ViewItem(String key) {
|
||||
mKey = key;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return new StringBuilder("ViewItem:{")
|
||||
.append("Key:").append(mKey)
|
||||
.append(",IsChecked:").append(mIsChecked)
|
||||
.append(",IsEnabled:").append(mIsEnabled)
|
||||
.append('}').toString();
|
||||
}
|
||||
}
|
||||
|
||||
private void log(String msg) {
|
||||
FeatureFactory.getFactory(getApplication()).getWifiFeatureProvider().verboseLog(TAG, msg);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user