• 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 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.MetricsProto.MetricsEvent;
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
getMetricsCategory()53     protected int getMetricsCategory() {
54         return MetricsEvent.INPUTMETHOD_KEYBOARD;
55     }
56 
57     @Override
onCreate(Bundle icicle)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
onResume()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
onPause()91     public void onPause() {
92         mIm.unregisterInputDeviceListener(this);
93         mInputDeviceId = -1;
94 
95         super.onPause();
96     }
97 
98     @Override
onPreferenceTreeClick(Preference preference)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
onInputDeviceAdded(int deviceId)119     public void onInputDeviceAdded(int deviceId) {
120     }
121 
122     @Override
onInputDeviceChanged(int deviceId)123     public void onInputDeviceChanged(int deviceId) {
124         if (mInputDeviceId >= 0 && deviceId == mInputDeviceId) {
125             updateCheckedState();
126         }
127     }
128 
129     @Override
onInputDeviceRemoved(int deviceId)130     public void onInputDeviceRemoved(int deviceId) {
131         if (mInputDeviceId >= 0 && deviceId == mInputDeviceId) {
132             getActivity().finish();
133         }
134     }
135 
createPreferenceHierarchy()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 
updateCheckedState()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 }
161