diff --git a/res/xml/wifi_configure_settings.xml b/res/xml/wifi_configure_settings.xml index a5152acb09e..996e8798e0a 100644 --- a/res/xml/wifi_configure_settings.xml +++ b/res/xml/wifi_configure_settings.xml @@ -31,7 +31,8 @@ android:key="use_open_wifi_automatically" android:icon="@drawable/ic_open_wifi_autoconnect" android:title="@string/use_open_wifi_automatically_title" - android:summary="@string/use_open_wifi_automatically_summary" /> + android:summary="@string/use_open_wifi_automatically_summary" + settings:controller="com.android.settings.wifi.UseOpenWifiPreferenceController"/> createPreferenceControllers(Context context) { - mUseOpenWifiPreferenceController = new UseOpenWifiPreferenceController(context, this, - getSettingsLifecycle()); final WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); final List controllers = new ArrayList<>(); controllers.add(new NotifyOpenNetworksPreferenceController(context, getSettingsLifecycle())); - controllers.add(mUseOpenWifiPreferenceController); controllers.add(new WifiInfoPreferenceController(context, getSettingsLifecycle(), wifiManager)); controllers.add(new WifiP2pPreferenceController(context, getSettingsLifecycle(), @@ -92,8 +89,12 @@ public class ConfigureWifiSettings extends DashboardFragment { public void onAttach(Context context) { super.onAttach(context); + mWifiWakeupPreferenceController = use(WifiWakeupPreferenceController.class); mWifiWakeupPreferenceController.setFragment(this); + + mUseOpenWifiPreferenceController = use(UseOpenWifiPreferenceController.class); + mUseOpenWifiPreferenceController.setFragment(this); } @Override @@ -102,8 +103,7 @@ public class ConfigureWifiSettings extends DashboardFragment { mWifiWakeupPreferenceController.onActivityResult(requestCode, resultCode); return; } - if (requestCode == UseOpenWifiPreferenceController.REQUEST_CODE_OPEN_WIFI_AUTOMATICALLY - && mUseOpenWifiPreferenceController != null) { + if (requestCode == UseOpenWifiPreferenceController.REQUEST_CODE_OPEN_WIFI_AUTOMATICALLY) { mUseOpenWifiPreferenceController.onActivityResult(requestCode, resultCode); return; } diff --git a/src/com/android/settings/wifi/UseOpenWifiPreferenceController.java b/src/com/android/settings/wifi/UseOpenWifiPreferenceController.java index eef22167bb2..27cf1e2e809 100644 --- a/src/com/android/settings/wifi/UseOpenWifiPreferenceController.java +++ b/src/com/android/settings/wifi/UseOpenWifiPreferenceController.java @@ -17,12 +17,10 @@ import android.text.TextUtils; import androidx.fragment.app.Fragment; import androidx.preference.Preference; import androidx.preference.PreferenceScreen; -import androidx.preference.SwitchPreference; import com.android.settings.R; import com.android.settings.core.PreferenceControllerMixin; -import com.android.settingslib.core.AbstractPreferenceController; -import com.android.settingslib.core.lifecycle.Lifecycle; +import com.android.settings.core.TogglePreferenceController; import com.android.settingslib.core.lifecycle.LifecycleObserver; import com.android.settingslib.core.lifecycle.events.OnPause; import com.android.settingslib.core.lifecycle.events.OnResume; @@ -30,10 +28,10 @@ import com.android.settingslib.core.lifecycle.events.OnResume; import java.util.List; /** - * {@link AbstractPreferenceController} that controls whether a user wants to enable the "use open - * networks automatically" feature provider by the current network recommendation provider. + * {@link TogglePreferenceController} that controls whether a user wants to enable the "use open + * networks automatically" feature provided by the current network recommendation provider. */ -public class UseOpenWifiPreferenceController extends AbstractPreferenceController +public class UseOpenWifiPreferenceController extends TogglePreferenceController implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener, LifecycleObserver, OnResume, OnPause { public static final int REQUEST_CODE_OPEN_WIFI_AUTOMATICALLY = 400; @@ -41,7 +39,7 @@ public class UseOpenWifiPreferenceController extends AbstractPreferenceControlle private static final String KEY_USE_OPEN_WIFI_AUTOMATICALLY = "use_open_wifi_automatically"; private final ContentResolver mContentResolver; - private final Fragment mFragment; + private Fragment mFragment; private final NetworkScoreManager mNetworkScoreManager; private final SettingObserver mSettingObserver; @@ -49,17 +47,18 @@ public class UseOpenWifiPreferenceController extends AbstractPreferenceControlle private ComponentName mEnableUseWifiComponentName; private boolean mDoFeatureSupportedScorersExist; - public UseOpenWifiPreferenceController(Context context, Fragment fragment, - Lifecycle lifecycle) { - super(context); + public UseOpenWifiPreferenceController(Context context) { + super(context, KEY_USE_OPEN_WIFI_AUTOMATICALLY); mContentResolver = context.getContentResolver(); - mFragment = fragment; mNetworkScoreManager = (NetworkScoreManager) context.getSystemService(Context.NETWORK_SCORE_SERVICE); mSettingObserver = new SettingObserver(); updateEnableUseWifiComponentName(); checkForFeatureSupportedScorers(); - lifecycle.addObserver(this); + } + + public void setFragment(Fragment hostFragment) { + mFragment = hostFragment; } private void updateEnableUseWifiComponentName() { @@ -86,7 +85,7 @@ public class UseOpenWifiPreferenceController extends AbstractPreferenceControlle @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); - mPreference = screen.findPreference(KEY_USE_OPEN_WIFI_AUTOMATICALLY); + mPreference = screen.findPreference(getPreferenceKey()); } @Override @@ -100,67 +99,54 @@ public class UseOpenWifiPreferenceController extends AbstractPreferenceControlle } @Override - public boolean isAvailable() { - return mDoFeatureSupportedScorersExist; - } - - @Override - public String getPreferenceKey() { - return KEY_USE_OPEN_WIFI_AUTOMATICALLY; + public int getAvailabilityStatus() { + return mDoFeatureSupportedScorersExist ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } @Override public void updateState(Preference preference) { - if (!(preference instanceof SwitchPreference)) { - return; - } - final SwitchPreference useOpenWifiPreference = (SwitchPreference) preference; + super.updateState(preference); - boolean isScorerSet = mNetworkScoreManager.getActiveScorerPackage() != null; - boolean doesActiveScorerSupportFeature = mEnableUseWifiComponentName != null; - - useOpenWifiPreference.setChecked(isSettingEnabled()); - useOpenWifiPreference.setVisible(isAvailable()); - useOpenWifiPreference.setEnabled(isScorerSet && doesActiveScorerSupportFeature); + final boolean isScorerSet = mNetworkScoreManager.getActiveScorerPackage() != null; + final boolean doesActiveScorerSupportFeature = mEnableUseWifiComponentName != null; + preference.setEnabled(isScorerSet && doesActiveScorerSupportFeature); if (!isScorerSet) { - useOpenWifiPreference.setSummary( - R.string.use_open_wifi_automatically_summary_scoring_disabled); + preference.setSummary(R.string.use_open_wifi_automatically_summary_scoring_disabled); } else if (!doesActiveScorerSupportFeature) { - useOpenWifiPreference.setSummary( + preference.setSummary( R.string.use_open_wifi_automatically_summary_scorer_unsupported_disabled); } else { - useOpenWifiPreference.setSummary(R.string.use_open_wifi_automatically_summary); + preference.setSummary(R.string.use_open_wifi_automatically_summary); } } @Override - public boolean onPreferenceChange(Preference preference, Object newValue) { - if (!TextUtils.equals(preference.getKey(), KEY_USE_OPEN_WIFI_AUTOMATICALLY) - || !isAvailable()) { - return false; - } - - if (isSettingEnabled()) { - Settings.Global.putString(mContentResolver, - Settings.Global.USE_OPEN_WIFI_PACKAGE, ""); - return true; - } - - Intent intent = new Intent(NetworkScoreManager.ACTION_CUSTOM_ENABLE); - intent.setComponent(mEnableUseWifiComponentName); - mFragment.startActivityForResult(intent, REQUEST_CODE_OPEN_WIFI_AUTOMATICALLY); - return false; // Updating state is done in onActivityResult. - } - - private boolean isSettingEnabled() { - String enabledUseOpenWifiPackage = Settings.Global.getString(mContentResolver, + public boolean isChecked() { + final String enabledUseOpenWifiPackage = Settings.Global.getString(mContentResolver, Settings.Global.USE_OPEN_WIFI_PACKAGE); - String currentUseOpenWifiPackage = mEnableUseWifiComponentName == null + final String currentUseOpenWifiPackage = mEnableUseWifiComponentName == null ? null : mEnableUseWifiComponentName.getPackageName(); return TextUtils.equals(enabledUseOpenWifiPackage, currentUseOpenWifiPackage); } + @Override + public boolean setChecked(boolean isChecked) { + if (isChecked) { + if (mFragment == null) { + throw new IllegalStateException("No fragment to start activity"); + } + + final Intent intent = new Intent(NetworkScoreManager.ACTION_CUSTOM_ENABLE); + intent.setComponent(mEnableUseWifiComponentName); + mFragment.startActivityForResult(intent, REQUEST_CODE_OPEN_WIFI_AUTOMATICALLY); + return false; // Updating state is done in onActivityResult. + } else { + Settings.Global.putString(mContentResolver, Settings.Global.USE_OPEN_WIFI_PACKAGE, ""); + return true; + } + } + public boolean onActivityResult(int requestCode, int resultCode) { if (requestCode != REQUEST_CODE_OPEN_WIFI_AUTOMATICALLY) { return false; diff --git a/tests/robotests/src/com/android/settings/wifi/UseOpenWifiPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/UseOpenWifiPreferenceControllerTest.java index 47f1c262460..beaa1a6b8ca 100644 --- a/tests/robotests/src/com/android/settings/wifi/UseOpenWifiPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/UseOpenWifiPreferenceControllerTest.java @@ -43,7 +43,6 @@ import androidx.preference.Preference; import androidx.preference.SwitchPreference; import com.android.settings.R; -import com.android.settingslib.core.lifecycle.Lifecycle; import com.google.common.collect.Lists; @@ -76,8 +75,6 @@ public class UseOpenWifiPreferenceControllerTest { sAppDataNoActivity = new NetworkScorerAppData(0, null, null, null, null); } - @Mock - private Lifecycle mLifecycle; @Mock private Fragment mFragment; @Mock @@ -97,7 +94,8 @@ public class UseOpenWifiPreferenceControllerTest { } private void createController() { - mController = new UseOpenWifiPreferenceController(mContext, mFragment, mLifecycle); + mController = new UseOpenWifiPreferenceController(mContext); + mController.setFragment(mFragment); } /** @@ -146,52 +144,28 @@ public class UseOpenWifiPreferenceControllerTest { } @Test - public void onPreferenceChange_nonMatchingKey_shouldDoNothing() { - createController(); - - final SwitchPreference pref = new SwitchPreference(mContext); - - assertThat(mController.onPreferenceChange(pref, null)).isFalse(); - } - - @Test - public void onPreferenceChange_notAvailable_shouldDoNothing() { - createController(); - - final Preference pref = new Preference(mContext); - pref.setKey(mController.getPreferenceKey()); - - assertThat(mController.onPreferenceChange(pref, null)).isFalse(); - } - - @Test - public void onPreferenceChange_matchingKeyAndAvailable_enableShouldStartEnableActivity() { + public void setChecked_withTrue_enableShouldStartEnableActivity() { setupScorers(Lists.newArrayList(sAppData, sAppDataNoActivity)); createController(); - final SwitchPreference pref = new SwitchPreference(mContext); - pref.setKey(mController.getPreferenceKey()); + mController.setChecked(true); - assertThat(mController.onPreferenceChange(pref, null)).isFalse(); verify(mFragment).startActivityForResult(mIntentCaptor.capture(), eq(REQUEST_CODE_OPEN_WIFI_AUTOMATICALLY)); - Intent activityIntent = mIntentCaptor.getValue(); + final Intent activityIntent = mIntentCaptor.getValue(); assertThat(activityIntent.getComponent()).isEqualTo(sEnableActivityComponent); assertThat(activityIntent.getAction()).isEqualTo(NetworkScoreManager.ACTION_CUSTOM_ENABLE); } @Test - public void onPreferenceChange_matchingKeyAndAvailable_disableShouldUpdateSetting() { + public void setChecked_withFalse_disableShouldUpdateSetting() { setupScorers(Lists.newArrayList(sAppData, sAppDataNoActivity)); Settings.Global.putString(mContext.getContentResolver(), USE_OPEN_WIFI_PACKAGE, sEnableActivityComponent.getPackageName()); - createController(); - final SwitchPreference pref = new SwitchPreference(mContext); - pref.setKey(mController.getPreferenceKey()); + mController.setChecked(false); - assertThat(mController.onPreferenceChange(pref, null)).isTrue(); assertThat(Settings.Global.getString(mContext.getContentResolver(), USE_OPEN_WIFI_PACKAGE)) .isEqualTo(""); }