• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.inputmethod;
18 
19 import com.android.settings.R;
20 import com.android.settings.SettingsPreferenceFragment;
21 
22 import android.content.Context;
23 import android.hardware.input.InputManager;
24 import android.hardware.input.InputManager.InputDeviceListener;
25 import android.hardware.input.KeyboardLayout;
26 import android.os.Bundle;
27 import android.preference.CheckBoxPreference;
28 import android.preference.Preference;
29 import android.preference.PreferenceScreen;
30 import android.view.InputDevice;
31 
32 import java.util.Arrays;
33 import java.util.HashMap;
34 import java.util.Map;
35 
36 public class KeyboardLayoutPickerFragment extends SettingsPreferenceFragment
37         implements InputDeviceListener {
38     private String mInputDeviceDescriptor;
39     private int mInputDeviceId = -1;
40     private InputManager mIm;
41     private KeyboardLayout[] mKeyboardLayouts;
42     private HashMap<CheckBoxPreference, KeyboardLayout> mPreferenceMap =
43             new HashMap<CheckBoxPreference, KeyboardLayout>();
44 
45     /**
46      * Intent extra: The input device descriptor of the keyboard whose keyboard
47      * layout is to be changed.
48      */
49     public static final String EXTRA_INPUT_DEVICE_DESCRIPTOR = "input_device_descriptor";
50 
51     @Override
onCreate(Bundle icicle)52     public void onCreate(Bundle icicle) {
53         super.onCreate(icicle);
54 
55         mInputDeviceDescriptor = getActivity().getIntent().getStringExtra(
56                 EXTRA_INPUT_DEVICE_DESCRIPTOR);
57         if (mInputDeviceDescriptor == null) {
58             getActivity().finish();
59         }
60 
61         mIm = (InputManager)getSystemService(Context.INPUT_SERVICE);
62         mKeyboardLayouts = mIm.getKeyboardLayouts();
63         Arrays.sort(mKeyboardLayouts);
64         setPreferenceScreen(createPreferenceHierarchy());
65     }
66 
67     @Override
onResume()68     public void onResume() {
69         super.onResume();
70 
71         mIm.registerInputDeviceListener(this, null);
72 
73         InputDevice inputDevice = mIm.getInputDeviceByDescriptor(mInputDeviceDescriptor);
74         if (inputDevice == null) {
75             getActivity().finish();
76             return;
77         }
78         mInputDeviceId = inputDevice.getId();
79 
80         updateCheckedState();
81     }
82 
83     @Override
onPause()84     public void onPause() {
85         mIm.unregisterInputDeviceListener(this);
86         mInputDeviceId = -1;
87 
88         super.onPause();
89     }
90 
91     @Override
onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference)92     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
93             Preference preference) {
94         if (preference instanceof CheckBoxPreference) {
95             CheckBoxPreference checkboxPref = (CheckBoxPreference)preference;
96             KeyboardLayout layout = mPreferenceMap.get(checkboxPref);
97             if (layout != null) {
98                 boolean checked = checkboxPref.isChecked();
99                 if (checked) {
100                     mIm.addKeyboardLayoutForInputDevice(mInputDeviceDescriptor,
101                             layout.getDescriptor());
102                 } else {
103                     mIm.removeKeyboardLayoutForInputDevice(mInputDeviceDescriptor,
104                             layout.getDescriptor());
105                 }
106                 return true;
107             }
108         }
109         return super.onPreferenceTreeClick(preferenceScreen, preference);
110     }
111 
112     @Override
onInputDeviceAdded(int deviceId)113     public void onInputDeviceAdded(int deviceId) {
114     }
115 
116     @Override
onInputDeviceChanged(int deviceId)117     public void onInputDeviceChanged(int deviceId) {
118         if (mInputDeviceId >= 0 && deviceId == mInputDeviceId) {
119             updateCheckedState();
120         }
121     }
122 
123     @Override
onInputDeviceRemoved(int deviceId)124     public void onInputDeviceRemoved(int deviceId) {
125         if (mInputDeviceId >= 0 && deviceId == mInputDeviceId) {
126             getActivity().finish();
127         }
128     }
129 
createPreferenceHierarchy()130     private PreferenceScreen createPreferenceHierarchy() {
131         PreferenceScreen root = getPreferenceManager().createPreferenceScreen(getActivity());
132         Context context = getActivity();
133 
134         for (KeyboardLayout layout : mKeyboardLayouts) {
135             CheckBoxPreference pref = new CheckBoxPreference(context);
136             pref.setTitle(layout.getLabel());
137             pref.setSummary(layout.getCollection());
138             root.addPreference(pref);
139             mPreferenceMap.put(pref, layout);
140         }
141         return root;
142     }
143 
updateCheckedState()144     private void updateCheckedState() {
145         String[] enabledKeyboardLayouts = mIm.getKeyboardLayoutsForInputDevice(
146                 mInputDeviceDescriptor);
147         Arrays.sort(enabledKeyboardLayouts);
148 
149         for (Map.Entry<CheckBoxPreference, KeyboardLayout> entry : mPreferenceMap.entrySet()) {
150             entry.getKey().setChecked(Arrays.binarySearch(enabledKeyboardLayouts,
151                     entry.getValue().getDescriptor()) >= 0);
152         }
153     }
154 }
155