Use new input device listener API to refresh keyboards.

Bug: 6110399
Change-Id: Ibb0bbeb40af2ee7204e4682bc7493262407fd83f
diff --git a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
index ac9a27b..7d02a1f 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
@@ -52,7 +52,7 @@
 import java.util.Set;
 
 public class InputMethodAndLanguageSettings extends SettingsPreferenceFragment
-        implements Preference.OnPreferenceChangeListener{
+        implements Preference.OnPreferenceChangeListener, InputManager.InputDeviceListener {
 
     private static final String KEY_PHONE_LANGUAGE = "phone_language";
     private static final String KEY_CURRENT_INPUT_METHOD = "current_input_method";
@@ -78,6 +78,7 @@
             new ArrayList<InputMethodPreference>();
     private final ArrayList<PreferenceScreen> mHardKeyboardPreferenceList =
             new ArrayList<PreferenceScreen>();
+    private InputManager mIm;
     private InputMethodManager mImm;
     private List<InputMethodInfo> mImis;
     private boolean mIsOnlyImeSettings;
@@ -159,6 +160,7 @@
         }
 
         // Build hard keyboard preference category.
+        mIm = (InputManager)getActivity().getSystemService(Context.INPUT_SERVICE);
         updateHardKeyboards();
 
         // Spell Checker
@@ -214,6 +216,9 @@
     @Override
     public void onResume() {
         super.onResume();
+
+        mIm.registerInputDeviceListener(this, null);
+
         if (!mIsOnlyImeSettings) {
             if (mLanguagePref != null) {
                 Configuration conf = getResources().getConfiguration();
@@ -251,6 +256,9 @@
     @Override
     public void onPause() {
         super.onPause();
+
+        mIm.unregisterInputDeviceListener(this);
+
         if (SHOW_INPUT_METHOD_SWITCHER_SETTINGS) {
             mShowInputMethodSelectorPref.setOnPreferenceChangeListener(null);
         }
@@ -259,6 +267,21 @@
     }
 
     @Override
+    public void onInputDeviceAdded(int deviceId) {
+        updateHardKeyboards();
+    }
+
+    @Override
+    public void onInputDeviceChanged(int deviceId) {
+        updateHardKeyboards();
+    }
+
+    @Override
+    public void onInputDeviceRemoved(int deviceId) {
+        updateHardKeyboards();
+    }
+
+    @Override
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
         // Input Method stuff
         if (Utils.isMonkeyRunning()) {
@@ -362,9 +385,6 @@
     private void updateHardKeyboards() {
         mHardKeyboardPreferenceList.clear();
         if (getResources().getConfiguration().keyboard == Configuration.KEYBOARD_QWERTY) {
-            final InputManager im =
-                    (InputManager)getActivity().getSystemService(Context.INPUT_SERVICE);
-
             final int[] devices = InputDevice.getDeviceIds();
             for (int i = 0; i < devices.length; i++) {
                 InputDevice device = InputDevice.getDevice(devices[i]);
@@ -374,9 +394,9 @@
                         && device.getKeyboardType() == InputDevice.KEYBOARD_TYPE_ALPHABETIC) {
                     final String inputDeviceDescriptor = device.getDescriptor();
                     final String keyboardLayoutDescriptor =
-                            im.getKeyboardLayoutForInputDevice(inputDeviceDescriptor);
+                            mIm.getKeyboardLayoutForInputDevice(inputDeviceDescriptor);
                     final KeyboardLayout keyboardLayout = keyboardLayoutDescriptor != null ?
-                            im.getKeyboardLayout(keyboardLayoutDescriptor) : null;
+                            mIm.getKeyboardLayout(keyboardLayoutDescriptor) : null;
 
                     final Intent intent = new Intent(Intent.ACTION_MAIN);
                     intent.setClass(getActivity(), KeyboardLayoutPickerActivity.class);
@@ -409,6 +429,8 @@
                 pref.setOrder(i);
                 mHardKeyboardCategory.addPreference(pref);
             }
+
+            getPreferenceScreen().addPreference(mHardKeyboardCategory);
         } else {
             getPreferenceScreen().removePreference(mHardKeyboardCategory);
         }