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.savedaccesspoints;
18 
19 import android.content.Context;
20 import android.net.wifi.WifiManager;
21 
22 import androidx.annotation.VisibleForTesting;
23 import androidx.preference.Preference;
24 import androidx.preference.PreferenceGroup;
25 import androidx.preference.PreferenceScreen;
26 
27 import com.android.settings.core.BasePreferenceController;
28 import com.android.settingslib.wifi.AccessPoint;
29 import com.android.settingslib.wifi.AccessPointPreference;
30 import com.android.settingslib.wifi.AccessPointPreference.UserBadgeCache;
31 import com.android.settingslib.wifi.WifiSavedConfigUtils;
32 
33 import java.util.List;
34 import java.util.stream.Collectors;
35 
36 /**
37  * Controller that manages a PreferenceGroup, which contains a list of saved access points.
38  *
39  * Migrating from Wi-Fi SettingsLib to to WifiTrackerLib, this object will be removed in the near
40  * future, please develop in
41  * {@link com.android.settings.wifi.savedaccesspoints2.SavedAccessPointsPreferenceController2}.
42  */
43 public class SavedAccessPointsPreferenceController extends BasePreferenceController implements
44         Preference.OnPreferenceClickListener {
45 
46     protected final WifiManager mWifiManager;
47     private final UserBadgeCache mUserBadgeCache;
48     private PreferenceGroup mPreferenceGroup;
49     private SavedAccessPointsWifiSettings mHost;
50     @VisibleForTesting
51     List<AccessPoint> mAccessPoints;
52 
SavedAccessPointsPreferenceController(Context context, String preferenceKey)53     public SavedAccessPointsPreferenceController(Context context, String preferenceKey) {
54         super(context, preferenceKey);
55         mUserBadgeCache = new AccessPointPreference.UserBadgeCache(context.getPackageManager());
56         mWifiManager = context.getSystemService(WifiManager.class);
57     }
58 
setHost(SavedAccessPointsWifiSettings host)59     public SavedAccessPointsPreferenceController setHost(SavedAccessPointsWifiSettings host) {
60         mHost = host;
61         return this;
62     }
63 
64     @Override
getAvailabilityStatus()65     public int getAvailabilityStatus() {
66         refreshSavedAccessPoints();
67         return mAccessPoints.size() > 0 ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
68     }
69 
70     @Override
displayPreference(PreferenceScreen screen)71     public void displayPreference(PreferenceScreen screen) {
72         mPreferenceGroup = screen.findPreference(getPreferenceKey());
73         refreshSavedAccessPoints();
74         updatePreference();
75         super.displayPreference(screen);
76     }
77 
78     @Override
onPreferenceClick(Preference preference)79     public boolean onPreferenceClick(Preference preference) {
80         if (mHost != null) {
81             final Preference preferenceInGroup =
82                     mPreferenceGroup.findPreference(preference.getKey());
83             mHost.showWifiPage((AccessPointPreference) preferenceInGroup);
84         }
85         return false;
86     }
87 
refreshSavedAccessPoints()88     protected void refreshSavedAccessPoints() {
89         mAccessPoints = WifiSavedConfigUtils.getAllConfigs(mContext, mWifiManager).stream()
90                 .filter(accessPoint -> !accessPoint.isPasspointConfig())
91                 .sorted(SavedNetworkComparator.INSTANCE)
92                 .collect(Collectors.toList());
93     }
94 
updatePreference()95     private void updatePreference() {
96         mPreferenceGroup.removeAll();
97         for (AccessPoint accessPoint : mAccessPoints) {
98             final String key = accessPoint.getKey();
99 
100             final AccessPointPreference preference = new AccessPointPreference(accessPoint,
101                     mContext, mUserBadgeCache, true /* forSavedNetworks */);
102             preference.setKey(key);
103             preference.setIcon(null);
104             preference.setOnPreferenceClickListener(this);
105 
106             mPreferenceGroup.addPreference(preference);
107         }
108     }
109 }
110