Add setting to disable animations

Fixes: 12910879
Test: make RunSettingsRoboTests
Also went to Settings -> Accessibility, turned off animations,
and observed that animations stopped. Turned it back on, and
the came back. Also fiddled with the granular settings in
developer options, which behaved as expected.

Change-Id: I189fbc4152d3cdb5ee45562c33f94c739f569c32
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 694a1b0..4a8e7e3 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -4353,6 +4353,8 @@
     <string name="accessibility_power_button_ends_call_prerefence_title">Power button ends call</string>
     <!-- Title for the accessibility preference for enabling/disabling large icons for mouse/trackpad pointers. [CHAR LIMIT=35] -->
     <string name="accessibility_toggle_large_pointer_icon_title">Large mouse pointer</string>
+    <!-- Title for the accessibility preference for disabling animations. [CHAR LIMIT=35] -->
+    <string name="accessibility_disable_animations">Remove animations</string>
     <!-- Title for the accessibility preference for master mono. [CHAR LIMIT=35] -->
     <string name="accessibility_toggle_master_mono_title">Mono audio</string>
     <!-- Summary for the accessibility preference for master mono. [CHAR LIMIT=50] -->
diff --git a/res/xml/accessibility_settings.xml b/res/xml/accessibility_settings.xml
index d7d2e02..b5da848 100644
--- a/res/xml/accessibility_settings.xml
+++ b/res/xml/accessibility_settings.xml
@@ -62,6 +62,10 @@
         <SwitchPreference
                 android:key="toggle_large_pointer_icon"
                 android:title="@string/accessibility_toggle_large_pointer_icon_title" />
+
+        <SwitchPreference
+            android:key="toggle_disable_animations"
+            android:title="@string/accessibility_disable_animations" />
     </PreferenceCategory>
 
     <PreferenceCategory
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index 2161415..160176e 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -97,6 +97,7 @@
             "toggle_lock_screen_rotation_preference";
     private static final String TOGGLE_LARGE_POINTER_ICON =
             "toggle_large_pointer_icon";
+    private static final String TOGGLE_DISABLE_ANIMATIONS = "toggle_disable_animations";
     private static final String TOGGLE_MASTER_MONO =
             "toggle_master_mono";
     private static final String SELECT_LONG_PRESS_TIMEOUT_PREFERENCE =
@@ -135,6 +136,14 @@
     // presentation.
     private static final long DELAY_UPDATE_SERVICES_MILLIS = 1000;
 
+    // Settings that should be changed when toggling animations
+    private static final String[] TOGGLE_ANIMATION_TARGETS = {
+            Settings.Global.WINDOW_ANIMATION_SCALE, Settings.Global.TRANSITION_ANIMATION_SCALE,
+            Settings.Global.ANIMATOR_DURATION_SCALE
+    };
+    private static final String ANIMATION_ON_VALUE = "1";
+    private static final String ANIMATION_OFF_VALUE = "0";
+
     private final Map<String, String> mLongPressTimeoutValueToTitleMap = new HashMap<>();
 
     private final Handler mHandler = new Handler();
@@ -194,6 +203,7 @@
     private SwitchPreference mTogglePowerButtonEndsCallPreference;
     private SwitchPreference mToggleLockScreenRotationPreference;
     private SwitchPreference mToggleLargePointerIconPreference;
+    private SwitchPreference mToggleDisableAnimationsPreference;
     private SwitchPreference mToggleMasterMonoPreference;
     private ListPreference mSelectLongPressTimeoutPreference;
     private Preference mNoServicesMessagePreference;
@@ -317,6 +327,9 @@
         } else if (mToggleLargePointerIconPreference == preference) {
             handleToggleLargePointerIconPreferenceClick();
             return true;
+        } else if (mToggleDisableAnimationsPreference == preference) {
+            handleToggleDisableAnimations();
+            return true;
         } else if (mToggleMasterMonoPreference == preference) {
             handleToggleMasterMonoPreferenceClick();
             return true;
@@ -349,6 +362,14 @@
                 mToggleLargePointerIconPreference.isChecked() ? 1 : 0);
     }
 
+    private void handleToggleDisableAnimations() {
+        String newAnimationValue = mToggleDisableAnimationsPreference.isChecked()
+                ? ANIMATION_OFF_VALUE : ANIMATION_ON_VALUE;
+        for (String animationPreference : TOGGLE_ANIMATION_TARGETS) {
+            Settings.Global.putString(getContentResolver(), animationPreference, newAnimationValue);
+        }
+    }
+
     private void handleToggleMasterMonoPreferenceClick() {
         Settings.System.putIntForUser(getContentResolver(), Settings.System.MASTER_MONO,
                 mToggleMasterMonoPreference.isChecked() ? 1 : 0, UserHandle.USER_CURRENT);
@@ -389,6 +410,9 @@
         mToggleLargePointerIconPreference =
                 (SwitchPreference) findPreference(TOGGLE_LARGE_POINTER_ICON);
 
+        mToggleDisableAnimationsPreference =
+                (SwitchPreference) findPreference(TOGGLE_DISABLE_ANIMATIONS);
+
         // Master Mono
         mToggleMasterMonoPreference =
                 (SwitchPreference) findPreference(TOGGLE_MASTER_MONO);
@@ -620,6 +644,8 @@
         mToggleLargePointerIconPreference.setChecked(Settings.Secure.getInt(getContentResolver(),
                 Settings.Secure.ACCESSIBILITY_LARGE_POINTER_ICON, 0) != 0);
 
+        updateDisableAnimationsToggle();
+
         // Master mono
         updateMasterMono();
 
@@ -702,6 +728,19 @@
         }
     }
 
+    private void updateDisableAnimationsToggle() {
+        boolean allAnimationsDisabled = true;
+        for (String animationSetting : TOGGLE_ANIMATION_TARGETS) {
+            if (!TextUtils.equals(
+                    Settings.Global.getString(getContentResolver(), animationSetting),
+                    ANIMATION_OFF_VALUE)) {
+                allAnimationsDisabled = false;
+                break;
+            }
+        }
+        mToggleDisableAnimationsPreference.setChecked(allAnimationsDisabled);
+    }
+
     private void updateMasterMono() {
         final boolean masterMono = Settings.System.getIntForUser(
                 getContentResolver(), Settings.System.MASTER_MONO,