blob: 5a21bb76e3a976011a09571e4afe9c4bbfb86e94 [file] [log] [blame]
Amin Shaikh1cf25742017-02-02 15:47:53 -08001package com.android.settings.wifi;
2
3import android.app.Activity;
4import android.app.Fragment;
5import android.content.ComponentName;
6import android.content.ContentResolver;
7import android.content.Context;
8import android.content.Intent;
9import android.database.ContentObserver;
10import android.net.NetworkScoreManager;
Amin Shaikh1cf25742017-02-02 15:47:53 -080011import android.net.NetworkScorerAppData;
12import android.net.Uri;
13import android.os.Handler;
14import android.os.Looper;
15import android.provider.Settings;
16import android.support.annotation.VisibleForTesting;
17import android.support.v14.preference.SwitchPreference;
18import android.support.v7.preference.Preference;
19import android.support.v7.preference.PreferenceScreen;
20import android.text.TextUtils;
21
Stephen Chen7e270062017-06-23 15:14:14 -070022import com.android.settings.R;
Tony Mantler1d583e12017-06-13 13:09:25 -070023import com.android.settings.core.PreferenceControllerMixin;
24import com.android.settingslib.core.AbstractPreferenceController;
Juan Lang777ed252017-05-09 15:42:36 -070025import com.android.settingslib.core.lifecycle.Lifecycle;
26import com.android.settingslib.core.lifecycle.LifecycleObserver;
27import com.android.settingslib.core.lifecycle.events.OnPause;
28import com.android.settingslib.core.lifecycle.events.OnResume;
Amin Shaikh1cf25742017-02-02 15:47:53 -080029
Stephen Chen7e270062017-06-23 15:14:14 -070030import java.util.List;
31
Amin Shaikh1cf25742017-02-02 15:47:53 -080032/**
Tony Mantler1d583e12017-06-13 13:09:25 -070033 * {@link AbstractPreferenceController} that controls whether a user wants to enable the "use open
34 * networks automatically" feature provider by the current network recommendation provider.
Amin Shaikh1cf25742017-02-02 15:47:53 -080035 */
Tony Mantler1d583e12017-06-13 13:09:25 -070036public class UseOpenWifiPreferenceController extends AbstractPreferenceController
37 implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener,
38 LifecycleObserver, OnResume, OnPause {
Salvador Martinez2f529242018-03-19 08:41:32 -070039 public static final int REQUEST_CODE_OPEN_WIFI_AUTOMATICALLY = 400;
40
Amin Shaikh1cf25742017-02-02 15:47:53 -080041 private static final String KEY_USE_OPEN_WIFI_AUTOMATICALLY = "use_open_wifi_automatically";
Amin Shaikh1cf25742017-02-02 15:47:53 -080042
43 private final ContentResolver mContentResolver;
44 private final Fragment mFragment;
Fan Zhang368c81e2018-03-29 17:00:39 -070045 private final NetworkScoreManager mNetworkScoreManager;
Amin Shaikh1cf25742017-02-02 15:47:53 -080046 private final SettingObserver mSettingObserver;
47
48 private Preference mPreference;
49 private ComponentName mEnableUseWifiComponentName;
Stephen Chen7e270062017-06-23 15:14:14 -070050 private boolean mDoFeatureSupportedScorersExist;
Amin Shaikh1cf25742017-02-02 15:47:53 -080051
52 public UseOpenWifiPreferenceController(Context context, Fragment fragment,
Fan Zhang368c81e2018-03-29 17:00:39 -070053 Lifecycle lifecycle) {
Amin Shaikh1cf25742017-02-02 15:47:53 -080054 super(context);
55 mContentResolver = context.getContentResolver();
56 mFragment = fragment;
Fan Zhang368c81e2018-03-29 17:00:39 -070057 mNetworkScoreManager =
58 (NetworkScoreManager) context.getSystemService(Context.NETWORK_SCORE_SERVICE);
Amin Shaikh1cf25742017-02-02 15:47:53 -080059 mSettingObserver = new SettingObserver();
60 updateEnableUseWifiComponentName();
Stephen Chen7e270062017-06-23 15:14:14 -070061 checkForFeatureSupportedScorers();
Amin Shaikh1cf25742017-02-02 15:47:53 -080062 lifecycle.addObserver(this);
63 }
64
65 private void updateEnableUseWifiComponentName() {
Fan Zhang368c81e2018-03-29 17:00:39 -070066 NetworkScorerAppData appData = mNetworkScoreManager.getActiveScorer();
Amin Shaikh1cf25742017-02-02 15:47:53 -080067 mEnableUseWifiComponentName =
68 appData == null ? null : appData.getEnableUseOpenWifiActivity();
69 }
70
Stephen Chen7e270062017-06-23 15:14:14 -070071 private void checkForFeatureSupportedScorers() {
72 if (mEnableUseWifiComponentName != null) {
73 mDoFeatureSupportedScorersExist = true;
74 return;
75 }
Fan Zhang368c81e2018-03-29 17:00:39 -070076 List<NetworkScorerAppData> scorers = mNetworkScoreManager.getAllValidScorers();
Stephen Chen7e270062017-06-23 15:14:14 -070077 for (NetworkScorerAppData scorer : scorers) {
78 if (scorer.getEnableUseOpenWifiActivity() != null) {
79 mDoFeatureSupportedScorersExist = true;
80 return;
81 }
82 }
83 mDoFeatureSupportedScorersExist = false;
84 }
85
Amin Shaikh1cf25742017-02-02 15:47:53 -080086 @Override
87 public void displayPreference(PreferenceScreen screen) {
88 super.displayPreference(screen);
89 mPreference = screen.findPreference(KEY_USE_OPEN_WIFI_AUTOMATICALLY);
90 }
91
92 @Override
93 public void onResume() {
94 mSettingObserver.register(mContentResolver);
95 }
96
97 @Override
98 public void onPause() {
99 mSettingObserver.unregister(mContentResolver);
100 }
101
102 @Override
103 public boolean isAvailable() {
Stephen Chen7e270062017-06-23 15:14:14 -0700104 return mDoFeatureSupportedScorersExist;
Amin Shaikh1cf25742017-02-02 15:47:53 -0800105 }
106
107 @Override
108 public String getPreferenceKey() {
109 return KEY_USE_OPEN_WIFI_AUTOMATICALLY;
110 }
111
112 @Override
113 public void updateState(Preference preference) {
114 if (!(preference instanceof SwitchPreference)) {
115 return;
116 }
117 final SwitchPreference useOpenWifiPreference = (SwitchPreference) preference;
Stephen Chen7e270062017-06-23 15:14:14 -0700118
Fan Zhang368c81e2018-03-29 17:00:39 -0700119 boolean isScorerSet = mNetworkScoreManager.getActiveScorerPackage() != null;
Stephen Chen7e270062017-06-23 15:14:14 -0700120 boolean doesActiveScorerSupportFeature = mEnableUseWifiComponentName != null;
121
Amin Shaikh1cf25742017-02-02 15:47:53 -0800122 useOpenWifiPreference.setChecked(isSettingEnabled());
Stephen Chen7e270062017-06-23 15:14:14 -0700123 useOpenWifiPreference.setVisible(isAvailable());
124 useOpenWifiPreference.setEnabled(isScorerSet && doesActiveScorerSupportFeature);
125
126 if (!isScorerSet) {
127 useOpenWifiPreference.setSummary(
128 R.string.use_open_wifi_automatically_summary_scoring_disabled);
129 } else if (!doesActiveScorerSupportFeature) {
130 useOpenWifiPreference.setSummary(
131 R.string.use_open_wifi_automatically_summary_scorer_unsupported_disabled);
132 } else {
133 useOpenWifiPreference.setSummary(R.string.use_open_wifi_automatically_summary);
134 }
Amin Shaikh1cf25742017-02-02 15:47:53 -0800135 }
136
137 @Override
138 public boolean onPreferenceChange(Preference preference, Object newValue) {
139 if (!TextUtils.equals(preference.getKey(), KEY_USE_OPEN_WIFI_AUTOMATICALLY)
140 || !isAvailable()) {
141 return false;
142 }
143
144 if (isSettingEnabled()) {
145 Settings.Global.putString(mContentResolver,
146 Settings.Global.USE_OPEN_WIFI_PACKAGE, "");
147 return true;
148 }
149
150 Intent intent = new Intent(NetworkScoreManager.ACTION_CUSTOM_ENABLE);
151 intent.setComponent(mEnableUseWifiComponentName);
152 mFragment.startActivityForResult(intent, REQUEST_CODE_OPEN_WIFI_AUTOMATICALLY);
153 return false; // Updating state is done in onActivityResult.
154 }
155
156 private boolean isSettingEnabled() {
157 String enabledUseOpenWifiPackage = Settings.Global.getString(mContentResolver,
158 Settings.Global.USE_OPEN_WIFI_PACKAGE);
159 String currentUseOpenWifiPackage = mEnableUseWifiComponentName == null
160 ? null : mEnableUseWifiComponentName.getPackageName();
161 return TextUtils.equals(enabledUseOpenWifiPackage, currentUseOpenWifiPackage);
162 }
163
164 public boolean onActivityResult(int requestCode, int resultCode) {
165 if (requestCode != REQUEST_CODE_OPEN_WIFI_AUTOMATICALLY) {
166 return false;
167 }
168
169 if (resultCode == Activity.RESULT_OK) {
170 Settings.Global.putString(mContentResolver, Settings.Global.USE_OPEN_WIFI_PACKAGE,
171 mEnableUseWifiComponentName.getPackageName());
172 }
173 return true;
174 }
175
176 class SettingObserver extends ContentObserver {
177 private final Uri NETWORK_RECOMMENDATIONS_ENABLED_URI =
178 Settings.Global.getUriFor(Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED);
179
180 public SettingObserver() {
181 super(new Handler(Looper.getMainLooper()));
182 }
183
184 public void register(ContentResolver cr) {
185 cr.registerContentObserver(NETWORK_RECOMMENDATIONS_ENABLED_URI, false, this);
186 onChange(true /* selfChange */, NETWORK_RECOMMENDATIONS_ENABLED_URI);
187 }
188
189 public void unregister(ContentResolver cr) {
190 cr.unregisterContentObserver(this);
191 }
192
193 @Override
194 public void onChange(boolean selfChange, Uri uri) {
195 super.onChange(selfChange, uri);
196 if (NETWORK_RECOMMENDATIONS_ENABLED_URI.equals(uri)) {
197 updateEnableUseWifiComponentName();
198 updateState(mPreference);
199 }
200 }
201 }
202}