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