• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
20 import android.content.Context;
21 import android.net.wifi.WifiManager;
22 import android.util.Log;
23 
24 import androidx.annotation.VisibleForTesting;
25 import androidx.preference.Preference;
26 import androidx.preference.PreferenceGroup;
27 import androidx.preference.PreferenceScreen;
28 
29 import com.android.settings.core.BasePreferenceController;
30 import com.android.settings.utils.PreferenceGroupChildrenCache;
31 import com.android.settings.R;
32 import com.android.settingslib.core.lifecycle.LifecycleObserver;
33 import com.android.settingslib.core.lifecycle.events.OnStart;
34 import com.android.settingslib.utils.ThreadUtils;
35 import com.android.settingslib.wifi.AccessPoint;
36 import com.android.settingslib.wifi.AccessPointPreference;
37 import com.android.settingslib.wifi.AccessPointPreference.UserBadgeCache;
38 import com.android.settingslib.wifi.WifiSavedConfigUtils;
39 
40 import java.util.Collections;
41 import java.util.List;
42 
43 /**
44  * Controller that manages a PreferenceGroup, which contains a list of saved access points.
45  */
46 public class SavedAccessPointsPreferenceController extends BasePreferenceController implements
47         LifecycleObserver, OnStart, Preference.OnPreferenceClickListener,
48         WifiManager.ActionListener {
49 
50     private static final String TAG = "SavedAPPrefCtrl";
51 
52     private final WifiManager mWifiManager;
53     private final PreferenceGroupChildrenCache mChildrenCache;
54 
55     private final UserBadgeCache mUserBadgeCache;
56     private PreferenceGroup mPreferenceGroup;
57     private SavedAccessPointsWifiSettings mHost;
58 
SavedAccessPointsPreferenceController(Context context, String preferenceKey)59     public SavedAccessPointsPreferenceController(Context context,
60             String preferenceKey) {
61         super(context, preferenceKey);
62         mUserBadgeCache = new AccessPointPreference.UserBadgeCache(context.getPackageManager());
63         mWifiManager = context.getSystemService(WifiManager.class);
64         mChildrenCache = new PreferenceGroupChildrenCache();
65     }
66 
setHost(SavedAccessPointsWifiSettings host)67     public SavedAccessPointsPreferenceController setHost(SavedAccessPointsWifiSettings host) {
68         mHost = host;
69         return this;
70     }
71 
72     @Override
getAvailabilityStatus()73     public int getAvailabilityStatus() {
74         return AVAILABLE;
75     }
76 
77     @Override
displayPreference(PreferenceScreen screen)78     public void displayPreference(PreferenceScreen screen) {
79         super.displayPreference(screen);
80         mPreferenceGroup = screen.findPreference(getPreferenceKey());
81     }
82 
83     @Override
onStart()84     public void onStart() {
85         refreshSavedAccessPoints();
86     }
87 
postRefreshSavedAccessPoints()88     public void postRefreshSavedAccessPoints() {
89         ThreadUtils.postOnMainThread(() -> refreshSavedAccessPoints());
90     }
91 
92     @Override
onPreferenceClick(Preference preference)93     public boolean onPreferenceClick(Preference preference) {
94         if (mHost != null) {
95             mHost.showWifiPage((AccessPointPreference) preference);
96         }
97         return false;
98     }
99 
100     @Override
onSuccess()101     public void onSuccess() {
102         postRefreshSavedAccessPoints();
103     }
104 
105     @Override
onFailure(int reason)106     public void onFailure(int reason) {
107         postRefreshSavedAccessPoints();
108     }
109 
110     @VisibleForTesting
refreshSavedAccessPoints()111     void refreshSavedAccessPoints() {
112         if (mPreferenceGroup == null) {
113             Log.w(TAG, "PreferenceGroup is null, skipping.");
114             return;
115         }
116         final Context prefContext = mPreferenceGroup.getContext();
117 
118         final List<AccessPoint> accessPoints =
119                 WifiSavedConfigUtils.getAllConfigs(mContext, mWifiManager);
120         Collections.sort(accessPoints, SavedNetworkComparator.INSTANCE);
121         mChildrenCache.cacheRemoveAllPrefs(mPreferenceGroup);
122 
123         final int accessPointsSize = accessPoints.size();
124         for (int i = 0; i < accessPointsSize; ++i) {
125             AccessPoint ap = accessPoints.get(i);
126 
127             if (mHost != null && mHost.isSubscriptionsFeatureEnabled()
128                     && ap.isPasspointConfig()) {
129                 continue;
130             }
131 
132             String key = ap.getKey();
133             AccessPointPreference preference =
134                     (AccessPointPreference) mChildrenCache.getCachedPreference(key);
135             if (preference == null) {
136                 preference = new AccessPointPreference(ap, prefContext, mUserBadgeCache, true);
137                 preference.setKey(key);
138                 preference.setIcon(null);
139                 preference.setOnPreferenceClickListener(this);
140                 mPreferenceGroup.addPreference(preference);
141             }
142             preference.setOrder(i);
143         }
144 
145         mChildrenCache.removeCachedPrefs(mPreferenceGroup);
146 
147         if (mPreferenceGroup.getPreferenceCount() < 1) {
148             Log.w(TAG, "Saved networks activity loaded, but there are no saved networks!");
149             mPreferenceGroup.setVisible(false);
150         } else {
151             mPreferenceGroup.setVisible(true);
152         }
153 
154         if (mHost != null && !mHost.isSubscriptionsFeatureEnabled()) {
155             mPreferenceGroup.setVisible(true);
156             mPreferenceGroup.setTitle(null);
157             mPreferenceGroup.setLayoutResource(R.layout.preference_category_no_label);
158         }
159     }
160 }
161