Add "large text" accessibility option.

Also re-arrange the UI a bit to clearly put the button for
enabling/disabiling accessibility services along-side said
services.

Change-Id: Ica1ddecddf6e97800909ba6bea9ce4e124b59c01
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5839934..24161c2 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2611,12 +2611,14 @@
     <string name="accessibility_settings">Accessibility</string>
     <!-- Settings title for accessibility settings screen -->
     <string name="accessibility_settings_title">Accessibility settings</string>
-    <!-- Settings summary for accessibility settings -->
+    <!-- Settings summary for accessibility settings [CHAR LIMIT=40] -->
     <string name="accessibility_settings_summary">Manage accessibility options</string>
-    <!-- Setting Checkbox title for enabling accessibility -->
-    <string name="toggle_accessibility_title">Accessibility</string>
-    <!-- Setting accessibility services category -->
+    <!-- Setting Checkbox title for enabling accessibility large text [CHAR LIMIT=25] -->
+    <string name="toggle_large_text_title">Large text</string>
+    <!-- Setting accessibility services category [CHAR LIMIT=25] -->
     <string name="accessibility_services_category">Accessibility services</string>
+    <!-- Setting Checkbox title for enabling accessibility services [CHAR LIMIT=40] -->
+    <string name="toggle_accessibility_title">Allow accessibility services</string>
     <!-- Message for announcing the lack of installed accessibility services. -->
     <string name="no_accessibility_services_summary">No installed accessibility services.</string>
     <!-- Warning message about security implications of enabling an accessibility service,
@@ -2638,8 +2640,6 @@
         applications installed.\n\nYou can download a screen reader for your device from Android
         Market.\n\nClick "OK" to install the screen reader.</string>
 
-    <!-- Accessibility settings: Webpage accessibility scripts category [CHAR LIMIT=25] -->
-    <string name="accessibility_script_injection_category">Accessibility scripts</string>
     <!-- Accessibility settings: Checkbox title for enabling download of accessibility scripts [CHAR LIMIT=40] -->
     <string name="accessibility_script_injection_enabled">Download accessibility scripts</string>
     <!-- Accessibility settings: Checkbox summary for enabling download of accessibility scripts [CHAR LIMIT=65] -->
diff --git a/res/xml/accessibility_settings.xml b/res/xml/accessibility_settings.xml
index 771b69e..90aef84 100644
--- a/res/xml/accessibility_settings.xml
+++ b/res/xml/accessibility_settings.xml
@@ -19,20 +19,23 @@
         android:title="@string/accessibility_settings_title">
 
     <CheckBoxPreference
-            android:key="toggle_accessibility_service_checkbox"
-            android:title="@string/toggle_accessibility_title"
+            android:key="toggle_large_text_checkbox"
+            android:title="@string/toggle_large_text_title"
             android:persistent="false"/>
 
     <PreferenceCategory android:key="accessibility_services_category"
-            android:title="@string/accessibility_services_category" />
-
-    <PreferenceCategory android:key="accessibility_script_injection_category"
-            android:title="@string/accessibility_script_injection_category">
+            android:title="@string/accessibility_services_category">
+        <CheckBoxPreference
+                android:key="toggle_accessibility_service_checkbox"
+                android:title="@string/toggle_accessibility_title"
+                android:persistent="false"
+                android:order="-10000"/>
         <CheckBoxPreference
                 android:key="toggle_accessibility_script_injection_checkbox"
                 android:title="@string/accessibility_script_injection_enabled"
                 android:summary="@string/accessibility_script_injection_enabled_summary"
-                android:persistent="false" />
+                android:persistent="false"
+                android:order="10000" />
     </PreferenceCategory>
 
     <PreferenceCategory android:key="power_button_category"
diff --git a/src/com/android/settings/AccessibilitySettings.java b/src/com/android/settings/AccessibilitySettings.java
index 9a0db5d..bbb3678 100644
--- a/src/com/android/settings/AccessibilitySettings.java
+++ b/src/com/android/settings/AccessibilitySettings.java
@@ -17,14 +17,17 @@
 package com.android.settings;
 
 import android.accessibilityservice.AccessibilityServiceInfo;
+import android.app.ActivityManagerNative;
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.Service;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.ServiceInfo;
+import android.content.res.Configuration;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.RemoteException;
 import android.os.SystemProperties;
 import android.preference.CheckBoxPreference;
 import android.preference.ListPreference;
@@ -51,7 +54,12 @@
     private static final String DEFAULT_SCREENREADER_MARKET_LINK =
         "market://search?q=pname:com.google.android.marvin.talkback";
 
-    private final String TOGGLE_ACCESSIBILITY_CHECKBOX =
+    private static final float LARGE_FONT_SCALE = 1.3f;
+
+    private static final String TOGGLE_LARGE_TEXT_CHECKBOX =
+        "toggle_large_text_checkbox";
+
+    private static final String TOGGLE_ACCESSIBILITY_CHECKBOX =
         "toggle_accessibility_service_checkbox";
 
     private static final String ACCESSIBILITY_SERVICES_CATEGORY =
@@ -66,10 +74,10 @@
     private static final String POWER_BUTTON_ENDS_CALL_CHECKBOX =
         "power_button_ends_call";
 
-    private final String KEY_TOGGLE_ACCESSIBILITY_SERVICE_CHECKBOX =
+    private static final String KEY_TOGGLE_ACCESSIBILITY_SERVICE_CHECKBOX =
         "key_toggle_accessibility_service_checkbox";
 
-    private final String KEY_LONG_PRESS_TIMEOUT_LIST_PREFERENCE =
+    private static final String KEY_LONG_PRESS_TIMEOUT_LIST_PREFERENCE =
         "long_press_timeout_list_preference";
 
     private static final int DIALOG_ID_DISABLE_ACCESSIBILITY = 1;
@@ -77,6 +85,7 @@
     private static final int DIALOG_ID_ENABLE_ACCESSIBILITY_SERVICE = 3;
     private static final int DIALOG_ID_NO_ACCESSIBILITY_SERVICES = 4;
 
+    private CheckBoxPreference mToggleLargeTextCheckBox;
     private CheckBoxPreference mToggleAccessibilityCheckBox;
     private CheckBoxPreference mToggleScriptInjectionCheckBox;
     private SettingsCheckBoxPreference mToggleAccessibilityServiceCheckBox;
@@ -88,6 +97,8 @@
 
     private ListPreference mLongPressTimeoutListPreference;
 
+    private final Configuration mCurConfig = new Configuration();
+
     private Map<String, AccessibilityServiceInfo> mAccessibilityServices =
         new LinkedHashMap<String, AccessibilityServiceInfo>();
 
@@ -100,6 +111,9 @@
 
         addPreferencesFromResource(R.xml.accessibility_settings);
 
+        mToggleLargeTextCheckBox = (CheckBoxPreference) findPreference(
+                TOGGLE_LARGE_TEXT_CHECKBOX);
+
         mAccessibilityServicesCategory =
             (PreferenceGroup) findPreference(ACCESSIBILITY_SERVICES_CATEGORY);
 
@@ -145,7 +159,7 @@
 
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
-        addAccessibilitServicePreferences();
+        addAccessibilityServicePreferences();
 
         final HashSet<String> enabled = new HashSet<String>();
         String settingValue = Settings.Secure.getString(getContentResolver(),
@@ -192,6 +206,8 @@
             showDialog(DIALOG_ID_NO_ACCESSIBILITY_SERVICES);
         }
 
+        readFontSizePreference();
+
         super.onActivityCreated(savedInstanceState);
     }
 
@@ -251,10 +267,10 @@
         int count = mAccessibilityServicesCategory.getPreferenceCount();
         for (int i = 0; i < count; i++) {
             Preference pref = mAccessibilityServicesCategory.getPreference(i);
-            pref.setEnabled(isEnabled);
+            if (pref != mToggleAccessibilityCheckBox) {
+                pref.setEnabled(isEnabled);
+            }
         }
-
-        mToggleScriptInjectionCheckBox.setEnabled(isEnabled);
     }
 
     @Override
@@ -263,6 +279,13 @@
 
         if (TOGGLE_ACCESSIBILITY_CHECKBOX.equals(key)) {
             handleEnableAccessibilityStateChange((CheckBoxPreference) preference);
+        } else if (TOGGLE_LARGE_TEXT_CHECKBOX.equals(key)) {
+            try {
+                mCurConfig.fontScale = mToggleLargeTextCheckBox.isChecked()
+                        ? LARGE_FONT_SCALE : 1;
+                ActivityManagerNative.getDefault().updateConfiguration(mCurConfig);
+            } catch (RemoteException e) {
+            }
         } else if (POWER_BUTTON_ENDS_CALL_CHECKBOX.equals(key)) {
             boolean isChecked = ((CheckBoxPreference) preference).isChecked();
             // The checkbox is labeled "Power button ends call"; thus the in-call
@@ -355,20 +378,22 @@
     /**
      * Adds {@link CheckBoxPreference} for enabling or disabling an accessibility services.
      */
-    private void addAccessibilitServicePreferences() {
+    private void addAccessibilityServicePreferences() {
         AccessibilityManager accessibilityManager =
             (AccessibilityManager) getSystemService(Service.ACCESSIBILITY_SERVICE);
 
         List<AccessibilityServiceInfo> installedServices =
             accessibilityManager.getInstalledAccessibilityServiceList();
 
-        if (installedServices.isEmpty()) {
-            getPreferenceScreen().removePreference(mAccessibilityServicesCategory);
-            return;
+        for (int i = 0; i < mAccessibilityServicesCategory.getPreferenceCount(); i++) {
+            Preference pref = mAccessibilityServicesCategory.getPreference(i);
+            if (pref != mToggleAccessibilityCheckBox
+                    && pref != mToggleScriptInjectionCheckBox) {
+                mAccessibilityServicesCategory.removePreference(pref);
+                i--;
+            }
         }
 
-        getPreferenceScreen().addPreference(mAccessibilityServicesCategory);
-
         for (int i = 0, count = installedServices.size(); i < count; ++i) {
             AccessibilityServiceInfo accessibilityServiceInfo = installedServices.get(i);
             String key = accessibilityServiceInfo.getId();
@@ -385,6 +410,7 @@
                 SettingsCheckBoxPreference preference = new SettingsCheckBoxPreference(
                         getActivity(), settingsIntent);
                 preference.setKey(key);
+                preference.setOrder(i);
                 ServiceInfo serviceInfo = accessibilityServiceInfo.getResolveInfo().serviceInfo;
                 preference.setTitle(serviceInfo.loadLabel(getActivity().getPackageManager()));
                 mAccessibilityServicesCategory.addPreference(preference);
@@ -392,6 +418,16 @@
         }
     }
 
+    public void readFontSizePreference() {
+        try {
+            mCurConfig.updateFrom(
+                ActivityManagerNative.getDefault().getConfiguration());
+        } catch (RemoteException e) {
+        }
+        mToggleLargeTextCheckBox.setChecked(Float.compare(mCurConfig.fontScale,
+                LARGE_FONT_SCALE) == 0);
+    }
+
     @Override
     public Dialog onCreateDialog(int dialogId) {
         switch (dialogId) {