OSDN Git Service

ad1162e64ff2da04985d77571c6a640b05ea7636
[android-x86/packages-apps-Settings.git] / src / com / android / settings / inputmethod / KeyboardLayoutPickerFragment.java
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 android.content.Context;
20 import android.hardware.input.InputDeviceIdentifier;
21 import android.hardware.input.InputManager;
22 import android.hardware.input.InputManager.InputDeviceListener;
23 import android.hardware.input.KeyboardLayout;
24 import android.os.Bundle;
25 import android.support.v7.preference.CheckBoxPreference;
26 import android.support.v7.preference.Preference;
27 import android.support.v7.preference.PreferenceScreen;
28 import android.view.InputDevice;
29
30 import com.android.internal.logging.MetricsLogger;
31 import com.android.settings.SettingsPreferenceFragment;
32
33 import java.util.Arrays;
34 import java.util.HashMap;
35 import java.util.Map;
36
37 public class KeyboardLayoutPickerFragment extends SettingsPreferenceFragment
38         implements InputDeviceListener {
39     private InputDeviceIdentifier mInputDeviceIdentifier;
40     private int mInputDeviceId = -1;
41     private InputManager mIm;
42     private KeyboardLayout[] mKeyboardLayouts;
43     private HashMap<CheckBoxPreference, KeyboardLayout> mPreferenceMap =
44             new HashMap<CheckBoxPreference, KeyboardLayout>();
45
46     /**
47      * Intent extra: The input device descriptor of the keyboard whose keyboard
48      * layout is to be changed.
49      */
50     public static final String EXTRA_INPUT_DEVICE_IDENTIFIER = "input_device_identifier";
51
52     @Override
53     protected int getMetricsCategory() {
54         return MetricsLogger.INPUTMETHOD_KEYBOARD;
55     }
56
57     @Override
58     public void onCreate(Bundle icicle) {
59         super.onCreate(icicle);
60
61         mInputDeviceIdentifier = getActivity().getIntent().getParcelableExtra(
62                 EXTRA_INPUT_DEVICE_IDENTIFIER);
63         if (mInputDeviceIdentifier == null) {
64             getActivity().finish();
65         }
66
67         mIm = (InputManager)getSystemService(Context.INPUT_SERVICE);
68         mKeyboardLayouts = mIm.getKeyboardLayoutsForInputDevice(mInputDeviceIdentifier);
69         Arrays.sort(mKeyboardLayouts);
70         setPreferenceScreen(createPreferenceHierarchy());
71     }
72
73     @Override
74     public void onResume() {
75         super.onResume();
76
77         mIm.registerInputDeviceListener(this, null);
78
79         InputDevice inputDevice =
80                 mIm.getInputDeviceByDescriptor(mInputDeviceIdentifier.getDescriptor());
81         if (inputDevice == null) {
82             getActivity().finish();
83             return;
84         }
85         mInputDeviceId = inputDevice.getId();
86
87         updateCheckedState();
88     }
89
90     @Override
91     public void onPause() {
92         mIm.unregisterInputDeviceListener(this);
93         mInputDeviceId = -1;
94
95         super.onPause();
96     }
97
98     @Override
99     public boolean onPreferenceTreeClick(Preference preference) {
100         if (preference instanceof CheckBoxPreference) {
101             CheckBoxPreference checkboxPref = (CheckBoxPreference)preference;
102             KeyboardLayout layout = mPreferenceMap.get(checkboxPref);
103             if (layout != null) {
104                 boolean checked = checkboxPref.isChecked();
105                 if (checked) {
106                     mIm.addKeyboardLayoutForInputDevice(mInputDeviceIdentifier,
107                             layout.getDescriptor());
108                 } else {
109                     mIm.removeKeyboardLayoutForInputDevice(mInputDeviceIdentifier,
110                             layout.getDescriptor());
111                 }
112                 return true;
113             }
114         }
115         return super.onPreferenceTreeClick(preference);
116     }
117
118     @Override
119     public void onInputDeviceAdded(int deviceId) {
120     }
121
122     @Override
123     public void onInputDeviceChanged(int deviceId) {
124         if (mInputDeviceId >= 0 && deviceId == mInputDeviceId) {
125             updateCheckedState();
126         }
127     }
128
129     @Override
130     public void onInputDeviceRemoved(int deviceId) {
131         if (mInputDeviceId >= 0 && deviceId == mInputDeviceId) {
132             getActivity().finish();
133         }
134     }
135
136     private PreferenceScreen createPreferenceHierarchy() {
137         PreferenceScreen root = getPreferenceManager().createPreferenceScreen(getActivity());
138         Context context = getActivity();
139
140         for (KeyboardLayout layout : mKeyboardLayouts) {
141             CheckBoxPreference pref = new CheckBoxPreference(getPrefContext());
142             pref.setTitle(layout.getLabel());
143             pref.setSummary(layout.getCollection());
144             root.addPreference(pref);
145             mPreferenceMap.put(pref, layout);
146         }
147         return root;
148     }
149
150     private void updateCheckedState() {
151         String[] enabledKeyboardLayouts = mIm.getEnabledKeyboardLayoutsForInputDevice(
152                 mInputDeviceIdentifier);
153         Arrays.sort(enabledKeyboardLayouts);
154
155         for (Map.Entry<CheckBoxPreference, KeyboardLayout> entry : mPreferenceMap.entrySet()) {
156             entry.getKey().setChecked(Arrays.binarySearch(enabledKeyboardLayouts,
157                     entry.getValue().getDescriptor()) >= 0);
158         }
159     }
160 }