Add setting to redirect vibrator to game controller.

Bug: 6334179
Change-Id: I62c9c163aa4ee2c88286daee77641418869a1dab
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 6d7994f..fefd2ee 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2613,11 +2613,19 @@
     card numbers.  It comes from the app
     <xliff:g id="spellchecker_application_name">%1$s</xliff:g>.
     Use this spell checker?</string>
+
     <!-- On Language & input settings screen, heading. Inside the "Language & input settings" screen, this is the header for settings that relate to mouse and trackpad devices. [CHAR LIMIT=40] -->
     <string name="pointer_settings_category">Mouse/trackpad</string>
     <!-- On Language & input settings screen, setting summary.  Setting for mouse pointer speed. [CHAR LIMIT=35] -->
     <string name="pointer_speed">Pointer speed</string>
 
+    <!-- On Language & input settings screen, heading. Inside the "Language & input settings" screen, this is the header for settings that relate to game controller devices. [CHAR LIMIT=40] -->
+    <string name="game_controller_settings_category">Game Controller</string>
+    <!-- On Language & input settings screen, setting title.  Setting to redirect vibration to input devices. [CHAR LIMIT=35] -->
+    <string name="vibrate_input_devices">Use vibrator</string>
+    <!-- On Language & input settings screen, setting summary.  Setting to redirect vibration to input devices. [CHAR LIMIT=100] -->
+    <string name="vibrate_input_devices_summary">Redirect vibrator to game controller when connected.</string>
+
     <!-- Keyboard Layout Picker --> <skip />
     <!-- Title for the keyboard layout picker activity. [CHAR LIMIT=35] -->
     <string name="keyboard_layout_picker_title">Choose keyboard layout</string>
diff --git a/res/xml/language_settings.xml b/res/xml/language_settings.xml
index cfcc341..f001486 100644
--- a/res/xml/language_settings.xml
+++ b/res/xml/language_settings.xml
@@ -92,4 +92,14 @@
                 android:title="@string/pointer_speed"
                 android:dialogTitle="@string/pointer_speed" />
     </PreferenceCategory>
+
+    <PreferenceCategory android:key="game_controller_settings_category"
+            android:title="@string/game_controller_settings_category">
+        <CheckBoxPreference
+                android:key="vibrate_input_devices"
+                android:title="@string/vibrate_input_devices"
+                android:summaryOn="@string/vibrate_input_devices_summary"
+                android:summaryOff="@string/vibrate_input_devices_summary"
+                android:persistent="false"/>
+    </PreferenceCategory>
 </PreferenceScreen>
diff --git a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
index 7d02a1f..e764a73 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
@@ -73,6 +73,7 @@
     private ListPreference mShowInputMethodSelectorPref;
     private PreferenceCategory mKeyboardSettingsCategory;
     private PreferenceCategory mHardKeyboardCategory;
+    private PreferenceCategory mGameControllerCategory;
     private Preference mLanguagePref;
     private final ArrayList<InputMethodPreference> mInputMethodPreferenceList =
             new ArrayList<InputMethodPreference>();
@@ -118,6 +119,8 @@
         mHardKeyboardCategory = (PreferenceCategory)findPreference("hard_keyboard");
         mKeyboardSettingsCategory = (PreferenceCategory)findPreference(
                 "keyboard_settings_category");
+        mGameControllerCategory = (PreferenceCategory)findPreference(
+                "game_controller_settings_category");
 
         // Filter out irrelevant features if invoked from IME settings button.
         mIsOnlyImeSettings = Settings.ACTION_INPUT_METHOD_SETTINGS.equals(
@@ -159,9 +162,9 @@
             }
         }
 
-        // Build hard keyboard preference category.
+        // Build hard keyboard and game controller preference categories.
         mIm = (InputManager)getActivity().getSystemService(Context.INPUT_SERVICE);
-        updateHardKeyboards();
+        updateInputDevices();
 
         // Spell Checker
         final Intent intent = new Intent(Intent.ACTION_MAIN);
@@ -245,7 +248,7 @@
             }
         }
 
-        updateHardKeyboards();
+        updateInputDevices();
 
         // IME
         InputMethodAndSubtypeUtil.loadInputMethodSubtypeList(
@@ -268,17 +271,17 @@
 
     @Override
     public void onInputDeviceAdded(int deviceId) {
-        updateHardKeyboards();
+        updateInputDevices();
     }
 
     @Override
     public void onInputDeviceChanged(int deviceId) {
-        updateHardKeyboards();
+        updateInputDevices();
     }
 
     @Override
     public void onInputDeviceRemoved(int deviceId) {
-        updateHardKeyboards();
+        updateInputDevices();
     }
 
     @Override
@@ -306,6 +309,11 @@
                     }
                 }
             }
+            if (chkPref == mGameControllerCategory.findPreference("vibrate_input_devices")) {
+                System.putInt(getContentResolver(), Settings.System.VIBRATE_INPUT_DEVICES,
+                        chkPref.isChecked() ? 1 : 0);
+                return true;
+            }
         }
         return super.onPreferenceTreeClick(preferenceScreen, preference);
     }
@@ -382,6 +390,11 @@
         return pref;
     }
 
+    private void updateInputDevices() {
+        updateHardKeyboards();
+        updateGameControllers();
+    }
+
     private void updateHardKeyboards() {
         mHardKeyboardPreferenceList.clear();
         if (getResources().getConfiguration().keyboard == Configuration.KEYBOARD_QWERTY) {
@@ -436,6 +449,30 @@
         }
     }
 
+    private void updateGameControllers() {
+        if (haveInputDeviceWithVibrator()) {
+            getPreferenceScreen().addPreference(mGameControllerCategory);
+
+            CheckBoxPreference chkPref = (CheckBoxPreference)
+                    mGameControllerCategory.findPreference("vibrate_input_devices");
+            chkPref.setChecked(System.getInt(getContentResolver(),
+                    Settings.System.VIBRATE_INPUT_DEVICES, 1) > 0);
+        } else {
+            getPreferenceScreen().removePreference(mGameControllerCategory);
+        }
+    }
+
+    private boolean haveInputDeviceWithVibrator() {
+        final int[] devices = InputDevice.getDeviceIds();
+        for (int i = 0; i < devices.length; i++) {
+            InputDevice device = InputDevice.getDevice(devices[i]);
+            if (device != null && !device.isVirtual() && device.getVibrator().hasVibrator()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private class SettingsObserver extends ContentObserver {
         public SettingsObserver(Handler handler, Context context) {
             super(handler);