diff --git a/res/layout/icon_discrete_slider.xml b/res/layout/icon_discrete_slider.xml
index b1d960f..47be5ef 100644
--- a/res/layout/icon_discrete_slider.xml
+++ b/res/layout/icon_discrete_slider.xml
@@ -19,6 +19,7 @@
     android:id="@+id/seekbar_frame"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
+    android:clipChildren="false"
     android:background="?android:colorBackground"
     android:gravity="center_vertical">
 
diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml
index 37e71e2..5248da6 100755
--- a/res/values-land/dimens.xml
+++ b/res/values-land/dimens.xml
@@ -18,8 +18,6 @@
     <dimen name="appwidget_width">421dip</dimen>
     <dimen name="appwidget_height">68dip</dimen>
 
-    <dimen name="captioning_preview_height">100dp</dimen>
-
     <!-- ActionBar height -->
     <dimen name="actionbar_size">46dip</dimen>
 
diff --git a/res/values-sw600dp-land/dimens.xml b/res/values-sw600dp-land/dimens.xml
index 4e4a1d3..015a6af 100755
--- a/res/values-sw600dp-land/dimens.xml
+++ b/res/values-sw600dp-land/dimens.xml
@@ -19,8 +19,6 @@
     <dimen name="screen_margin_top">72dip</dimen>
     <dimen name="screen_margin_bottom">48dip</dimen>
 
-    <dimen name="captioning_preview_height">150dp</dimen>
-
     <dimen name="confirm_credentials_top_padding">20dp</dimen>
     <dimen name="confirm_credentials_top_margin">24dp</dimen>
 
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index b67bb22..c80e42c 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -49,7 +49,7 @@
     <dimen name="pager_tabs_title_padding">16dp</dimen>
     <dimen name="pager_tabs_selected_indicator_height">3dp</dimen>
 
-    <dimen name="captioning_preview_height">200dp</dimen>
+    <dimen name="captioning_preview_height">300dp</dimen>
 
     <dimen name="autoclick_preview_height">200dp</dimen>
 
diff --git a/res/xml/accessibility_text_reading_options.xml b/res/xml/accessibility_text_reading_options.xml
index ad742c9..7fd5ff9 100644
--- a/res/xml/accessibility_text_reading_options.xml
+++ b/res/xml/accessibility_text_reading_options.xml
@@ -27,7 +27,7 @@
 
     <com.android.settings.widget.LabeledSeekBarPreference
         android:key="font_size"
-        android:selectable="false"
+        android:selectable="true"
         android:summary="@string/short_summary_font_size"
         android:title="@string/title_font_size"
         settings:iconEnd="@drawable/ic_add_24dp"
@@ -38,7 +38,7 @@
 
     <com.android.settings.widget.LabeledSeekBarPreference
         android:key="display_size"
-        android:selectable="false"
+        android:selectable="true"
         android:summary="@string/screen_zoom_short_summary"
         android:title="@string/screen_zoom_title"
         settings:iconEnd="@drawable/ic_add_24dp"
diff --git a/src/com/android/settings/network/helper/LifecycleCallbackAdapter.java b/src/com/android/settings/network/helper/LifecycleCallbackAdapter.java
new file mode 100644
index 0000000..548eae5
--- /dev/null
+++ b/src/com/android/settings/network/helper/LifecycleCallbackAdapter.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.network.helper;
+
+import androidx.annotation.MainThread;
+import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleEventObserver;
+import androidx.lifecycle.LifecycleOwner;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * A {@link androidx.lifecycle.LifecycleObserver} implementation of adapter over callback.
+ *
+ * Which including:
+ * 1. Request to active callback when Lifecycle.State.STARTED
+ * 2. Request to inactive callback when Lifecycle.State.STOPPED
+ * 3. Close (no further resume) when Lifecycle.State.DESTROYED
+ */
+@VisibleForTesting
+abstract class LifecycleCallbackAdapter implements LifecycleEventObserver, AutoCloseable {
+    private static final String TAG = "LifecycleCallbackAdapter";
+    private AtomicReference<Lifecycle> mLifecycle = new AtomicReference<Lifecycle>();
+
+    /**
+     * Constructor
+     * @param lifecycle {@link Lifecycle} to monitor
+     */
+    @VisibleForTesting
+    protected LifecycleCallbackAdapter(@NonNull Lifecycle lifecycle) {
+        mLifecycle.set(lifecycle);
+        lifecycle.addObserver(this);
+    }
+
+    /**
+     * Get {@link Lifecycle} under monitor.
+     * @return {@link Lifecycle}. Return {@code null} when closed.
+     */
+    @VisibleForTesting
+    public Lifecycle getLifecycle() {
+        return mLifecycle.get();
+    }
+
+    /**
+     * Check current callback status.
+     * @return true when callback is active.
+     */
+    public abstract boolean isCallbackActive();
+
+    /**
+     * Change callback status.
+     * @param isActive true to active callback, otherwise inactive.
+     */
+    public abstract void setCallbackActive(boolean isActive);
+
+    /**
+     * Implementation of LifecycleEventObserver.
+     */
+    public void onStateChanged(LifecycleOwner source, Lifecycle.Event event) {
+        if (mLifecycle.get() == null) {
+            return;
+        }
+
+        Lifecycle.State state = event.getTargetState();
+        boolean expectCallbackActive = state.isAtLeast(Lifecycle.State.STARTED);
+        if (expectCallbackActive != isCallbackActive()) {
+            setCallbackActive(expectCallbackActive);
+        }
+        if (state == Lifecycle.State.DESTROYED) {
+            close();
+        }
+    }
+
+    /**
+     * Implementation of AutoCloseable.
+     */
+    @MainThread
+    public void close() {
+        Lifecycle lifecycle = mLifecycle.getAndSet(null);
+        if (lifecycle != null) {
+            lifecycle.removeObserver(this);
+        }
+    }
+}
diff --git a/tests/unit/src/com/android/settings/network/helper/LifecycleCallbackAdapterTest.java b/tests/unit/src/com/android/settings/network/helper/LifecycleCallbackAdapterTest.java
new file mode 100644
index 0000000..ddeb3f8
--- /dev/null
+++ b/tests/unit/src/com/android/settings/network/helper/LifecycleCallbackAdapterTest.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settings.network.helper;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleOwner;
+import androidx.lifecycle.LifecycleRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+public class LifecycleCallbackAdapterTest implements LifecycleOwner {
+
+    private final LifecycleRegistry mRegistry = LifecycleRegistry.createUnsafe(this);
+
+    private TestObj mTarget;
+
+    @Before
+    public void setUp() {
+        mTarget = new TestObj(getLifecycle());
+    }
+
+    public Lifecycle getLifecycle() {
+        return mRegistry;
+    }
+
+    @Test
+    public void lifecycle_get_lifecycleToMonitor() {
+        assertThat(mTarget.getLifecycle()).isEqualTo(mRegistry);
+    }
+
+    @Test
+    public void lifecycle_stateChangeToStart_callbackActive() {
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
+
+        assertThat(mTarget.getCallbackCount()).isEqualTo(0);
+        assertThat(mTarget.isCallbackActive()).isEqualTo(Boolean.FALSE);
+
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(mTarget.getCallbackCount()).isEqualTo(1);
+        assertThat(mTarget.isCallbackActive()).isEqualTo(Boolean.TRUE);
+    }
+
+    @Test
+    public void lifecycle_stateChangeToStop_callbackInActive() {
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
+
+        assertThat(mTarget.getCallbackCount()).isEqualTo(2);
+        assertThat(mTarget.isCallbackActive()).isEqualTo(Boolean.FALSE);
+    }
+
+    @Test
+    public void lifecycle_stateChangeToDestroy_noFurtherActive() {
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
+
+        assertThat(mTarget.getCallbackCount()).isEqualTo(2);
+        assertThat(mTarget.isCallbackActive()).isEqualTo(Boolean.FALSE);
+
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
+        mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
+
+        assertThat(mTarget.getCallbackCount()).isEqualTo(2);
+        assertThat(mTarget.isCallbackActive()).isEqualTo(Boolean.FALSE);
+    }
+
+    public static class TestObj extends LifecycleCallbackAdapter {
+        boolean mIsActive;
+        int mNumberOfCallback;
+
+        public TestObj(Lifecycle lifecycle) {
+            super(lifecycle);
+        }
+
+        public boolean isCallbackActive() {
+            return mIsActive;
+        }
+
+        public void setCallbackActive(boolean isActive) {
+            mIsActive = isActive;
+            mNumberOfCallback ++;
+        }
+
+        protected int getCallbackCount() {
+            return mNumberOfCallback;
+        }
+    }
+}
