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.details2;
18 
19 import android.app.backup.BackupManager;
20 import android.content.Context;
21 import android.net.wifi.WifiConfiguration;
22 
23 import androidx.annotation.VisibleForTesting;
24 import androidx.preference.DropDownPreference;
25 import androidx.preference.Preference;
26 import androidx.preference.PreferenceScreen;
27 
28 import com.android.settings.core.BasePreferenceController;
29 import com.android.settings.wifi.WifiDialog2;
30 import com.android.wifitrackerlib.WifiEntry;
31 
32 /**
33  * {@link AbstractPreferenceController} that controls whether the wifi network is metered or not
34  */
35 public class WifiMeteredPreferenceController2 extends BasePreferenceController implements
36         Preference.OnPreferenceChangeListener, WifiDialog2.WifiDialog2Listener {
37 
38     private static final String KEY_WIFI_METERED = "metered";
39     private WifiEntry mWifiEntry;
40     private Preference mPreference;
41 
WifiMeteredPreferenceController2(Context context, WifiEntry wifiEntry)42     public WifiMeteredPreferenceController2(Context context, WifiEntry wifiEntry) {
43         super(context, KEY_WIFI_METERED);
44         mWifiEntry = wifiEntry;
45     }
46 
47     @Override
updateState(Preference preference)48     public void updateState(Preference preference) {
49         final DropDownPreference dropDownPreference = (DropDownPreference) preference;
50         final int meteredOverride = getMeteredOverride();
51         preference.setSelectable(mWifiEntry.canSetMeteredChoice());
52         dropDownPreference.setValue(Integer.toString(meteredOverride));
53         updateSummary(dropDownPreference, meteredOverride);
54     }
55 
56     @Override
getAvailabilityStatus()57     public int getAvailabilityStatus() {
58         return AVAILABLE;
59     }
60 
61     @Override
onPreferenceChange(Preference preference, Object newValue)62     public boolean onPreferenceChange(Preference preference, Object newValue) {
63         if (mWifiEntry.isSaved() || mWifiEntry.isSubscription()) {
64             mWifiEntry.setMeteredChoice(Integer.parseInt((String) newValue));
65         }
66 
67         // Stage the backup of the SettingsProvider package which backs this up
68         BackupManager.dataChanged("com.android.providers.settings");
69         updateSummary((DropDownPreference) preference, getMeteredOverride());
70         return true;
71     }
72 
73     @VisibleForTesting
getMeteredOverride()74     int getMeteredOverride() {
75         if (mWifiEntry.isSaved() || mWifiEntry.isSubscription()) {
76             // Wrap the meteredOverride since robolectric cannot recognize it
77             return mWifiEntry.getMeteredChoice();
78         }
79         return WifiEntry.METERED_CHOICE_AUTO;
80     }
81 
updateSummary(DropDownPreference preference, int meteredOverride)82     private void updateSummary(DropDownPreference preference, int meteredOverride) {
83         preference.setSummary(preference.getEntries()[meteredOverride]);
84     }
85 
86     @Override
displayPreference(PreferenceScreen screen)87     public void displayPreference(PreferenceScreen screen) {
88         super.displayPreference(screen);
89         mPreference = screen.findPreference(getPreferenceKey());
90     }
91 
92     @Override
onSubmit(WifiDialog2 dialog)93     public void onSubmit(WifiDialog2 dialog) {
94         if (dialog.getController() != null && mWifiEntry.canSetMeteredChoice()) {
95             final WifiConfiguration newConfig = dialog.getController().getConfig();
96             if (newConfig == null) {
97                 return;
98             }
99 
100             if (getWifiEntryMeteredChoice(newConfig) != mWifiEntry.getMeteredChoice()) {
101                 mWifiEntry.setMeteredChoice(getWifiEntryMeteredChoice(newConfig));
102                 onPreferenceChange(mPreference, String.valueOf(newConfig.meteredOverride));
103             }
104         }
105     }
106 
getWifiEntryMeteredChoice(WifiConfiguration wifiConfiguration)107     private int getWifiEntryMeteredChoice(WifiConfiguration wifiConfiguration) {
108         switch (wifiConfiguration.meteredOverride) {
109             case WifiConfiguration.METERED_OVERRIDE_METERED:
110                 return WifiEntry.METERED_CHOICE_METERED;
111             case WifiConfiguration.METERED_OVERRIDE_NOT_METERED:
112                 return WifiEntry.METERED_CHOICE_UNMETERED;
113             default:
114                 return WifiEntry.METERED_CHOICE_AUTO;
115         }
116     }
117 }
118