This CL logically reverts Settings app changes for Bug 25752812, which
aimed to improve UX by tightly integrating physical keyboard layout
with input method subtype.
What went wrong is that the concept of input method subtype is not
widely accepted by the ecosystem actually. Until we figoure out any
other better way here, let's revert back to the good old way that
enables users to specify multiple keyboard layouts per physical
keyboard device, not one layout per one input method subtype.
Note that we cannot simply revert the CL that originally introduced
the new flow [1] because it was indeed a huge CL that also touched IME
settings, which we want to continue using. In that sense, this CL is
a kind of re-implementation of the previous style on top of the recent
language settings flow.
Note also that a fix [2] fox Bug 25062009 was also ported from
previous InputMethodAndLanguageSetting to
KeyboardLayoutPickerFragment.
[1]: I728d7ee185827ed328c16cb7abce244557a26518
976bb3f459
[2]: I4483dfc89afc8d148b2cfa7c6a5f66d2a02f712a
17b6319884
Fix: 66498367
Test: make -j RunSettingsRoboTests
Test: Manually done with two Bluetooth keyboards
Change-Id: I7a2ed6dd39dcd8207d3d94e12cd01d5d67ba4bb5
114 lines
3.4 KiB
Java
114 lines
3.4 KiB
Java
/*
|
|
* Copyright (C) 2017 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package com.android.settings.inputmethod;
|
|
|
|
import android.content.Context;
|
|
import android.hardware.input.InputManager;
|
|
import android.support.v7.preference.Preference;
|
|
|
|
import com.android.settings.R;
|
|
import com.android.settings.core.PreferenceControllerMixin;
|
|
import com.android.settings.inputmethod.PhysicalKeyboardFragment.HardKeyboardDeviceInfo;
|
|
import com.android.settingslib.core.AbstractPreferenceController;
|
|
import com.android.settingslib.core.lifecycle.Lifecycle;
|
|
import com.android.settingslib.core.lifecycle.LifecycleObserver;
|
|
import com.android.settingslib.core.lifecycle.events.OnPause;
|
|
import com.android.settingslib.core.lifecycle.events.OnResume;
|
|
|
|
import java.util.List;
|
|
|
|
public class PhysicalKeyboardPreferenceController extends AbstractPreferenceController
|
|
implements PreferenceControllerMixin, LifecycleObserver, OnResume, OnPause,
|
|
InputManager.InputDeviceListener {
|
|
|
|
private final InputManager mIm;
|
|
|
|
private Preference mPreference;
|
|
|
|
public PhysicalKeyboardPreferenceController(Context context, Lifecycle lifecycle) {
|
|
super(context);
|
|
mIm = (InputManager) context.getSystemService(Context.INPUT_SERVICE);
|
|
|
|
if (lifecycle != null) {
|
|
lifecycle.addObserver(this);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean isAvailable() {
|
|
return mContext.getResources().getBoolean(R.bool.config_show_physical_keyboard_pref);
|
|
}
|
|
|
|
@Override
|
|
public void updateState(Preference preference) {
|
|
mPreference = preference;
|
|
updateSummary();
|
|
}
|
|
|
|
@Override
|
|
public String getPreferenceKey() {
|
|
return "physical_keyboard_pref";
|
|
}
|
|
|
|
@Override
|
|
public void onPause() {
|
|
mIm.unregisterInputDeviceListener(this);
|
|
}
|
|
|
|
@Override
|
|
public void onResume() {
|
|
mIm.registerInputDeviceListener(this, null);
|
|
}
|
|
|
|
@Override
|
|
public void onInputDeviceAdded(int deviceId) {
|
|
updateSummary();
|
|
}
|
|
|
|
@Override
|
|
public void onInputDeviceRemoved(int deviceId) {
|
|
updateSummary();
|
|
}
|
|
|
|
@Override
|
|
public void onInputDeviceChanged(int deviceId) {
|
|
updateSummary();
|
|
}
|
|
|
|
private void updateSummary() {
|
|
if (mPreference == null) {
|
|
return;
|
|
}
|
|
final List<HardKeyboardDeviceInfo> keyboards =
|
|
PhysicalKeyboardFragment.getHardKeyboards(mContext);
|
|
if (keyboards.isEmpty()) {
|
|
mPreference.setSummary(R.string.disconnected);
|
|
return;
|
|
}
|
|
String summary = null;
|
|
for (HardKeyboardDeviceInfo info : keyboards) {
|
|
if (summary == null) {
|
|
summary = info.mDeviceName;
|
|
} else {
|
|
summary = mContext.getString(R.string.join_many_items_middle, summary,
|
|
info.mDeviceName);
|
|
}
|
|
}
|
|
mPreference.setSummary(summary);
|
|
}
|
|
}
|