diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 0ddd3ea..33976a6 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -701,6 +701,15 @@
         <item>120000</item>
     </integer-array>
 
+    <!-- Summaries of accessibility timeout, pairs to Values -->
+    <string-array name="accessibility_timeout_summaries" translatable="false">
+        <item>@string/accessibility_timeout_default</item>
+        <item>@string/accessibility_timeout_10secs</item>
+        <item>@string/accessibility_timeout_30secs</item>
+        <item>@string/accessibility_timeout_1min</item>
+        <item>@string/accessibility_timeout_2mins</item>
+    </string-array>
+
     <!-- Titles for the list of long press timeout options. -->
     <string-array name="long_press_timeout_selector_titles">
         <!-- A title for the option for short long-press timeout [CHAR LIMIT=25] -->
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index 65b0e86..d6590fa 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -21,6 +21,7 @@
 import android.accessibilityservice.AccessibilityServiceInfo;
 import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
+import android.content.ContentResolver;
 import android.content.Context;
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
@@ -63,6 +64,8 @@
 import com.android.settingslib.accessibility.AccessibilityUtils;
 import com.android.settingslib.search.SearchIndexable;
 
+import com.google.common.primitives.Ints;
+
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -125,6 +128,11 @@
             "vibration_preference_screen";
     private static final String DISPLAY_DALTONIZER_PREFERENCE_SCREEN =
             "daltonizer_preference";
+    private static final String ACCESSIBILITY_CONTENT_TIMEOUT_PREFERENCE =
+            "accessibility_content_timeout_preference_fragment";
+    private static final String ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE =
+            "accessibility_control_timeout_preference_fragment";
+
 
     // Extras passed to sub-fragments.
     static final String EXTRA_PREFERENCE_KEY = "preference_key";
@@ -718,6 +726,31 @@
         updateAutoclickSummary(mAutoclickPreferenceScreen);
 
         updateAccessibilityShortcut(mAccessibilityShortcutPreferenceScreen);
+
+        updateAccessibilityTimeoutSummary(getContentResolver(),
+                findPreference(ACCESSIBILITY_CONTENT_TIMEOUT_PREFERENCE));
+        updateAccessibilityTimeoutSummary(getContentResolver(),
+                findPreference(ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE));
+    }
+
+    void updateAccessibilityTimeoutSummary(ContentResolver resolver, Preference pref) {
+
+        String[] timeoutSummarys = getResources().getStringArray(
+                R.array.accessibility_timeout_summaries);
+        int[] timeoutValues = getResources().getIntArray(
+                R.array.accessibility_timeout_selector_values);
+
+        int timeoutValue = 0;
+        if (pref.getKey().equals(ACCESSIBILITY_CONTENT_TIMEOUT_PREFERENCE)) {
+            timeoutValue = AccessibilityTimeoutController.getSecureAccessibilityTimeoutValue(
+                    resolver, AccessibilityTimeoutController.CONTENT_TIMEOUT_SETTINGS_SECURE);
+        } else if (pref.getKey().equals(ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE)) {
+            timeoutValue = AccessibilityTimeoutController.getSecureAccessibilityTimeoutValue(
+                    resolver, AccessibilityTimeoutController.CONTROL_TIMEOUT_SETTINGS_SECURE);
+        }
+
+        int idx = Ints.indexOf(timeoutValues, timeoutValue);
+        pref.setSummary(timeoutSummarys[idx == -1 ? 0 : idx]);
     }
 
     private void updateMagnificationSummary(Preference pref) {
diff --git a/src/com/android/settings/accessibility/AccessibilityTimeoutController.java b/src/com/android/settings/accessibility/AccessibilityTimeoutController.java
index 2995df5..d933d92 100644
--- a/src/com/android/settings/accessibility/AccessibilityTimeoutController.java
+++ b/src/com/android/settings/accessibility/AccessibilityTimeoutController.java
@@ -31,6 +31,8 @@
 import com.android.settingslib.core.AbstractPreferenceController;
 import com.android.settingslib.core.lifecycle.Lifecycle;
 
+import com.google.common.primitives.Ints;
+
 import java.lang.Integer;
 
 import java.util.HashMap;
@@ -38,6 +40,10 @@
 
 public class AccessibilityTimeoutController extends AbstractPreferenceController implements
         LifecycleObserver, RadioButtonPreference.OnClickListener, PreferenceControllerMixin {
+    static final String CONTENT_TIMEOUT_SETTINGS_SECURE =
+            Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS;
+    static final String CONTROL_TIMEOUT_SETTINGS_SECURE =
+            Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS;
 
     // pair the preference key and timeout value
     private final Map<String, Integer> mAccessibilityTimeoutKeyToValueMap = new HashMap<>();
@@ -64,6 +70,15 @@
         mfragmentTag = fragmentTag;
     }
 
+    protected static int getSecureAccessibilityTimeoutValue(ContentResolver resolver, String name) {
+        String timeOutSec = Settings.Secure.getString(resolver, name);
+        if (timeOutSec == null) {
+            return 0;
+        }
+        Integer timeOutValue = Ints.tryParse(timeOutSec);
+        return timeOutValue == null ? 0 : timeOutValue;
+    }
+
     public void setOnChangeListener(OnChangeListener listener) {
         mOnChangeListener = listener;
     }
@@ -131,16 +146,17 @@
         }
     }
 
-    protected void getAccessibilityUiValue() {
-        String timeoutValue = null;
-        if (mfragmentTag.equals(AccessibilityContentTimeoutPreferenceFragment.TAG)) {
-            timeoutValue = Settings.Secure.getString(mContentResolver,
-                    Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS);
-        } else if (mfragmentTag.equals(AccessibilityControlTimeoutPreferenceFragment.TAG)) {
-            timeoutValue = Settings.Secure.getString(mContentResolver,
-                    Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS);
+    private int getAccessibilityTimeoutValue(String fragmentTag) {
+        int timeoutValue = 0;
+        // two kinds of Secure value, one is content timeout, the other is control timeout.
+        if (AccessibilityContentTimeoutPreferenceFragment.TAG.equals(fragmentTag)) {
+            timeoutValue = getSecureAccessibilityTimeoutValue(mContentResolver,
+                    CONTENT_TIMEOUT_SETTINGS_SECURE);
+        } else if (AccessibilityControlTimeoutPreferenceFragment.TAG.equals(fragmentTag)) {
+            timeoutValue = getSecureAccessibilityTimeoutValue(mContentResolver,
+                    CONTROL_TIMEOUT_SETTINGS_SECURE);
         }
-        mAccessibilityUiTimeoutValue = timeoutValue == null? 0: Integer.parseInt(timeoutValue);
+        return timeoutValue;
     }
 
     protected void updatePreferenceCheckedState(int value) {
@@ -153,7 +169,7 @@
     public void updateState(Preference preference) {
         super.updateState(preference);
 
-        getAccessibilityUiValue();
+        mAccessibilityUiTimeoutValue = getAccessibilityTimeoutValue(mfragmentTag);
 
         // reset RadioButton
         mPreference.setChecked(false);
diff --git a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
index cb2aa8b..00980ad 100644
--- a/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/AccessibilitySettingsTest.java
@@ -18,10 +18,10 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import static org.mockito.Matchers.anyString;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 
+import android.content.ContentResolver;
 import android.content.Context;
 import android.os.Vibrator;
 import android.provider.Settings;
@@ -32,6 +32,7 @@
 import com.android.settings.testutils.SettingsRobolectricTestRunner;
 import com.android.settings.testutils.XmlTestUtils;
 
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
@@ -42,31 +43,43 @@
 
 @RunWith(SettingsRobolectricTestRunner.class)
 public class AccessibilitySettingsTest {
+    private static final String VIBRATION_PREFERENCE_SCREEN = "vibration_preference_screen";
+    private static final String ACCESSIBILITY_CONTENT_TIMEOUT_PREFERENCE =
+            "accessibility_content_timeout_preference_fragment";
+    private static final String ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE =
+            "accessibility_control_timeout_preference_fragment";
+
+    private Context mContext;
+    private ContentResolver mContentResolver;
+    private AccessibilitySettings mSettings;
+
+    @Before
+    public void setup() {
+        MockitoAnnotations.initMocks(this);
+        mContext = RuntimeEnvironment.application;
+        mContentResolver = mContext.getContentResolver();
+        mSettings = spy(new AccessibilitySettings());
+        doReturn(mContext).when(mSettings).getContext();
+    }
 
     @Test
     public void testNonIndexableKeys_existInXmlLayout() {
-        final Context context = RuntimeEnvironment.application;
         final List<String> niks = AccessibilitySettings.SEARCH_INDEX_DATA_PROVIDER
-            .getNonIndexableKeys(context);
+            .getNonIndexableKeys(mContext);
         final List<String> keys = new ArrayList<>();
 
-        keys.addAll(XmlTestUtils.getKeysFromPreferenceXml(context, R.xml.accessibility_settings));
+        keys.addAll(XmlTestUtils.getKeysFromPreferenceXml(mContext, R.xml.accessibility_settings));
 
         assertThat(keys).containsAllIn(niks);
     }
 
     @Test
     public void testUpdateVibrationSummary_shouldUpdateSummary() {
-        MockitoAnnotations.initMocks(this);
-        final Context mContext = RuntimeEnvironment.application;
-        final AccessibilitySettings mSettings = spy(new AccessibilitySettings());
-
         final Preference mVibrationPreferenceScreen = new Preference(mContext);
-        doReturn(mVibrationPreferenceScreen).when(mSettings).findPreference(anyString());
+        doReturn(mVibrationPreferenceScreen).when(mSettings).findPreference(
+                VIBRATION_PREFERENCE_SCREEN);
 
-        doReturn(mContext).when(mSettings).getContext();
-
-        mVibrationPreferenceScreen.setKey("vibration_preference_screen");
+        mVibrationPreferenceScreen.setKey(VIBRATION_PREFERENCE_SCREEN);
 
         Settings.System.putInt(mContext.getContentResolver(),
                 Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
@@ -81,4 +94,58 @@
                 VibrationIntensityPreferenceController.getIntensityString(mContext,
                         Vibrator.VIBRATION_INTENSITY_OFF));
     }
+
+    @Test
+    public void testUpdateAccessibilityTimeoutSummary_shouldUpdateSummary() {
+        String[] testingValues = {null, "0", "10000", "30000", "60000", "120000"};
+        int[] exceptedResIds = {R.string.accessibility_timeout_default,
+                R.string.accessibility_timeout_default,
+                R.string.accessibility_timeout_10secs,
+                R.string.accessibility_timeout_30secs,
+                R.string.accessibility_timeout_1min,
+                R.string.accessibility_timeout_2mins
+        };
+
+        for (int i = 0; i < testingValues.length; i++) {
+            Settings.Secure.putString(mContentResolver,
+                    Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS, testingValues[i]);
+
+            verifyAccessibilityTimeoutSummary(ACCESSIBILITY_CONTENT_TIMEOUT_PREFERENCE,
+                    exceptedResIds[i]);
+
+            Settings.Secure.putString(mContentResolver,
+                    Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS, testingValues[i]);
+
+            verifyAccessibilityTimeoutSummary(ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE,
+                    exceptedResIds[i]);
+        }
+    }
+
+    @Test
+    public void testUpdateAccessibilityControlTimeoutSummary_invalidData_shouldUpdateSummary() {
+        String[] testingValues = {"-9009", "98277466643738977979666555536362343", "Hello,a prank"};
+
+        for (String value : testingValues) {
+            Settings.Secure.putString(mContentResolver,
+                    Settings.Secure.ACCESSIBILITY_NON_INTERACTIVE_UI_TIMEOUT_MS, value);
+
+            verifyAccessibilityTimeoutSummary(ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE,
+                    R.string.accessibility_timeout_default);
+
+            Settings.Secure.putString(mContentResolver,
+                    Settings.Secure.ACCESSIBILITY_INTERACTIVE_UI_TIMEOUT_MS, value);
+
+            verifyAccessibilityTimeoutSummary(ACCESSIBILITY_CONTROL_TIMEOUT_PREFERENCE,
+                    R.string.accessibility_timeout_default);
+        }
+    }
+
+    private void verifyAccessibilityTimeoutSummary(String preferenceKey, int resId) {
+        final Preference preference = new Preference(mContext);
+        doReturn(preference).when(mSettings).findPreference(preferenceKey);
+        preference.setKey(preferenceKey);
+        mSettings.updateAccessibilityTimeoutSummary(mContentResolver, preference);
+
+        assertThat(preference.getSummary()).isEqualTo(mContext.getResources().getString(resId));
+    }
 }
