diff --git a/src/com/android/settings/accessibility/ToggleAutoclickMainSwitchPreferenceController.java b/src/com/android/settings/accessibility/ToggleAutoclickMainSwitchPreferenceController.java index 1ecdac9eef8..96a3c0da6ba 100644 --- a/src/com/android/settings/accessibility/ToggleAutoclickMainSwitchPreferenceController.java +++ b/src/com/android/settings/accessibility/ToggleAutoclickMainSwitchPreferenceController.java @@ -21,9 +21,19 @@ import static com.android.settings.accessibility.AccessibilityUtil.State.ON; import android.content.ContentResolver; import android.content.Context; +import android.database.ContentObserver; +import android.net.Uri; +import android.os.Handler; +import android.os.Looper; import android.provider.Settings; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; +import androidx.lifecycle.DefaultLifecycleObserver; +import androidx.lifecycle.LifecycleOwner; +import androidx.preference.Preference; +import androidx.preference.PreferenceScreen; import com.android.server.accessibility.Flags; import com.android.settings.R; @@ -31,9 +41,24 @@ import com.android.settings.core.TogglePreferenceController; /** The controller to handle main switch to turn on or turn off accessibility autoclick. */ public class ToggleAutoclickMainSwitchPreferenceController - extends TogglePreferenceController { + extends TogglePreferenceController implements DefaultLifecycleObserver { + static final Uri ACCESSIBILITY_AUTOCLICK_ENABLED_URI = + Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_AUTOCLICK_ENABLED); private final ContentResolver mContentResolver; + private @Nullable Preference mPreference; + + @VisibleForTesting + final ContentObserver mSettingsObserver = + new ContentObserver(new Handler(Looper.getMainLooper())) { + @Override + public void onChange(boolean selfChange, @Nullable Uri uri) { + if (mPreference == null || uri == null) { + return; + } + updateState(mPreference); + } + }; public ToggleAutoclickMainSwitchPreferenceController( @NonNull Context context, @NonNull String preferenceKey) { @@ -46,6 +71,12 @@ public class ToggleAutoclickMainSwitchPreferenceController return Flags.enableAutoclickIndicator() ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } + @Override + public void displayPreference(@NonNull PreferenceScreen screen) { + super.displayPreference(screen); + mPreference = screen.findPreference(getPreferenceKey()); + } + @Override public boolean isChecked() { return Settings.Secure.getInt(mContentResolver, @@ -61,6 +92,19 @@ public class ToggleAutoclickMainSwitchPreferenceController return true; } + @Override + public void onStart(@NonNull LifecycleOwner owner) { + mContentResolver.registerContentObserver( + ACCESSIBILITY_AUTOCLICK_ENABLED_URI, + /* notifyForDescendants= */ false, + mSettingsObserver); + } + + @Override + public void onStop(@NonNull LifecycleOwner owner) { + mContentResolver.unregisterContentObserver(mSettingsObserver); + } + @Override public int getSliceHighlightMenuRes() { return R.string.menu_key_system; diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleAutoclickMainSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleAutoclickMainSwitchPreferenceControllerTest.java index b2f648acb70..80c96fc4cfe 100644 --- a/tests/robotests/src/com/android/settings/accessibility/ToggleAutoclickMainSwitchPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/ToggleAutoclickMainSwitchPreferenceControllerTest.java @@ -16,6 +16,9 @@ package com.android.settings.accessibility; +import static androidx.lifecycle.Lifecycle.Event.ON_START; +import static androidx.lifecycle.Lifecycle.Event.ON_STOP; + import static com.android.settings.accessibility.AccessibilityUtil.State.OFF; import static com.android.settings.accessibility.AccessibilityUtil.State.ON; @@ -26,15 +29,19 @@ import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import android.provider.Settings; +import androidx.lifecycle.LifecycleOwner; import androidx.test.core.app.ApplicationProvider; import com.android.settings.core.BasePreferenceController; +import com.android.settingslib.core.lifecycle.Lifecycle; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; +import org.robolectric.shadow.api.Shadow; +import org.robolectric.shadows.ShadowContentResolver; @RunWith(RobolectricTestRunner.class) public class ToggleAutoclickMainSwitchPreferenceControllerTest { @@ -43,11 +50,20 @@ public class ToggleAutoclickMainSwitchPreferenceControllerTest { @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); private final Context mContext = ApplicationProvider.getApplicationContext(); + + private ShadowContentResolver mShadowContentResolver; private ToggleAutoclickMainSwitchPreferenceController mController; + private LifecycleOwner mLifecycleOwner; + private Lifecycle mLifecycle; @Before public void setUp() { + mShadowContentResolver = Shadow.extract(mContext.getContentResolver()); + mController = new ToggleAutoclickMainSwitchPreferenceController(mContext, PREFERENCE_KEY); + mLifecycleOwner = () -> mLifecycle; + mLifecycle = new Lifecycle(mLifecycleOwner); + mLifecycle.addObserver(mController); } @Test @@ -80,4 +96,23 @@ public class ToggleAutoclickMainSwitchPreferenceControllerTest { Settings.Secure.ACCESSIBILITY_AUTOCLICK_ENABLED, OFF)) .isEqualTo(OFF); } + + @Test + public void onStart_shouldRegisterContentObserver() { + mLifecycle.handleLifecycleEvent(ON_START); + + assertThat(mShadowContentResolver.getContentObservers( + Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_AUTOCLICK_ENABLED))) + .hasSize(1); + } + + @Test + public void onStop_shouldUnregisterContentObserver() { + mLifecycle.handleLifecycleEvent(ON_START); + mLifecycle.handleLifecycleEvent(ON_STOP); + + assertThat(mShadowContentResolver.getContentObservers( + Settings.Secure.getUriFor(Settings.Secure.ACCESSIBILITY_AUTOCLICK_ENABLED))) + .isEmpty(); + } }