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