1 /*
2  * Copyright (C) 2019 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.savedaccesspoints2;
18 
19 import android.content.Context;
20 import android.text.TextUtils;
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.WifiEntryPreference;
29 import com.android.wifitrackerlib.WifiEntry;
30 
31 import java.util.ArrayList;
32 import java.util.List;
33 
34 /**
35  * Controller that manages a PreferenceGroup, which contains a list of saved access points.
36  */
37 public class SavedAccessPointsPreferenceController2 extends BasePreferenceController implements
38         Preference.OnPreferenceClickListener {
39 
40     private PreferenceGroup mPreferenceGroup;
41     private SavedAccessPointsWifiSettings2 mHost;
42     @VisibleForTesting
43     List<WifiEntry> mWifiEntries = new ArrayList<>();
44 
SavedAccessPointsPreferenceController2(Context context, String preferenceKey)45     public SavedAccessPointsPreferenceController2(Context context, String preferenceKey) {
46         super(context, preferenceKey);
47     }
48 
49     /**
50      * Set {@link SavedAccessPointsWifiSettings2} for click callback action.
51      */
setHost(SavedAccessPointsWifiSettings2 host)52     public SavedAccessPointsPreferenceController2 setHost(SavedAccessPointsWifiSettings2 host) {
53         mHost = host;
54         return this;
55     }
56 
57     @Override
getAvailabilityStatus()58     public int getAvailabilityStatus() {
59         return mWifiEntries.size() > 0 ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
60     }
61 
62     @Override
displayPreference(PreferenceScreen screen)63     public void displayPreference(PreferenceScreen screen) {
64         mPreferenceGroup = screen.findPreference(getPreferenceKey());
65         updatePreference();
66         super.displayPreference(screen);
67     }
68 
displayPreference(PreferenceScreen screen, List<WifiEntry> wifiEntries)69     void displayPreference(PreferenceScreen screen, List<WifiEntry> wifiEntries) {
70         if (wifiEntries == null || wifiEntries.isEmpty()) {
71             mWifiEntries.clear();
72         } else {
73             mWifiEntries = wifiEntries;
74         }
75 
76         displayPreference(screen);
77     }
78 
79     @Override
onPreferenceClick(Preference preference)80     public boolean onPreferenceClick(Preference preference) {
81         if (mHost != null) {
82             mHost.showWifiPage(preference.getKey(), preference.getTitle());
83         }
84         return false;
85     }
86 
87     /**
88      * mPreferenceGroup is not in a RecyclerView. To keep TalkBack focus, this method should not
89      * mPreferenceGroup.removeAll() then mPreferenceGroup.addPreference for mWifiEntries.
90      */
updatePreference()91     private void updatePreference() {
92         // Remove the Preference of removed WifiEntry.
93         final List<String> removedPreferenceKeys = new ArrayList<>();
94         final int preferenceCount = mPreferenceGroup.getPreferenceCount();
95         for (int i = 0; i < preferenceCount; i++) {
96             final String key = mPreferenceGroup.getPreference(i).getKey();
97             if (mWifiEntries.stream().filter(wifiEntry ->
98                     TextUtils.equals(key, wifiEntry.getKey())).count() == 0) {
99                 removedPreferenceKeys.add(key);
100             }
101         }
102         for (String removedPreferenceKey : removedPreferenceKeys) {
103             mPreferenceGroup.removePreference(
104                     mPreferenceGroup.findPreference(removedPreferenceKey));
105         }
106 
107         // Add the Preference of new added WifiEntry.
108         for (WifiEntry wifiEntry : mWifiEntries) {
109             if (mPreferenceGroup.findPreference(wifiEntry.getKey()) == null) {
110                 final WifiEntryPreference preference = new WifiEntryPreference(mContext, wifiEntry);
111                 preference.setKey(wifiEntry.getKey());
112                 preference.setOnPreferenceClickListener(this);
113 
114                 mPreferenceGroup.addPreference(preference);
115             }
116         }
117     }
118 }
119