Merge "Set preference visible to false when there is no keyboard." into udc-dev

This commit is contained in:
Daniel Huang
2023-03-06 07:26:57 +00:00
committed by Android (Google) Code Review
11 changed files with 93 additions and 48 deletions

View File

@@ -308,6 +308,12 @@ public class KeyboardLayoutDialogFragment extends InstrumentedDialogFragment
public Keyboards loadInBackground() { public Keyboards loadInBackground() {
Keyboards keyboards = new Keyboards(); Keyboards keyboards = new Keyboards();
InputManager im = (InputManager)getContext().getSystemService(Context.INPUT_SERVICE); InputManager im = (InputManager)getContext().getSystemService(Context.INPUT_SERVICE);
if (mInputDeviceIdentifier == null || NewKeyboardSettingsUtils.getInputDevice(
im, mInputDeviceIdentifier) == null) {
keyboards.keyboardLayouts.add(null); // default layout
keyboards.current = 0;
return keyboards;
}
String[] keyboardLayoutDescriptors = im.getEnabledKeyboardLayoutsForInputDevice( String[] keyboardLayoutDescriptors = im.getEnabledKeyboardLayoutsForInputDevice(
mInputDeviceIdentifier); mInputDeviceIdentifier);
for (String keyboardLayoutDescriptor : keyboardLayoutDescriptors) { for (String keyboardLayoutDescriptor : keyboardLayoutDescriptors) {

View File

@@ -21,7 +21,6 @@ import android.content.Context;
import android.hardware.input.InputDeviceIdentifier; import android.hardware.input.InputDeviceIdentifier;
import android.hardware.input.InputManager; import android.hardware.input.InputManager;
import android.hardware.input.KeyboardLayout; import android.hardware.input.KeyboardLayout;
import android.view.InputDevice;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.preference.Preference; import androidx.preference.Preference;
@@ -37,7 +36,6 @@ import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
public class KeyboardLayoutPickerController extends BasePreferenceController implements public class KeyboardLayoutPickerController extends BasePreferenceController implements
InputManager.InputDeviceListener, LifecycleObserver, OnStart, OnStop { InputManager.InputDeviceListener, LifecycleObserver, OnStart, OnStop {
@@ -68,15 +66,12 @@ public class KeyboardLayoutPickerController extends BasePreferenceController imp
@Override @Override
public void onStart() { public void onStart() {
mIm.registerInputDeviceListener(this, null); mIm.registerInputDeviceListener(this, null);
if (mInputDeviceIdentifier == null
final InputDevice inputDevice = || NewKeyboardSettingsUtils.getInputDevice(mIm, mInputDeviceIdentifier) == null) {
mIm.getInputDeviceByDescriptor(mInputDeviceIdentifier.getDescriptor());
if (inputDevice == null) {
mParent.getActivity().finish();
return; return;
} }
mInputDeviceId = inputDevice.getId(); mInputDeviceId =
NewKeyboardSettingsUtils.getInputDevice(mIm, mInputDeviceIdentifier).getId();
updateCheckedState(); updateCheckedState();
} }
@@ -150,6 +145,9 @@ public class KeyboardLayoutPickerController extends BasePreferenceController imp
} }
private void createPreferenceHierarchy() { private void createPreferenceHierarchy() {
if (mKeyboardLayouts == null) {
return;
}
for (KeyboardLayout layout : mKeyboardLayouts) { for (KeyboardLayout layout : mKeyboardLayouts) {
final SwitchPreference pref = new SwitchPreference(mScreen.getContext()); final SwitchPreference pref = new SwitchPreference(mScreen.getContext());
pref.setTitle(layout.getLabel()); pref.setTitle(layout.getLabel());

View File

@@ -19,11 +19,11 @@ package com.android.settings.inputmethod;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.hardware.input.InputDeviceIdentifier; import android.hardware.input.InputDeviceIdentifier;
import android.hardware.input.InputManager;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment; import com.android.settings.dashboard.DashboardFragment;
public class KeyboardLayoutPickerFragment extends DashboardFragment { public class KeyboardLayoutPickerFragment extends DashboardFragment {
private static final String TAG = "KeyboardLayoutPicker"; private static final String TAG = "KeyboardLayoutPicker";
@@ -45,10 +45,10 @@ public class KeyboardLayoutPickerFragment extends DashboardFragment {
final InputDeviceIdentifier inputDeviceIdentifier = getActivity().getIntent(). final InputDeviceIdentifier inputDeviceIdentifier = getActivity().getIntent().
getParcelableExtra(EXTRA_INPUT_DEVICE_IDENTIFIER); getParcelableExtra(EXTRA_INPUT_DEVICE_IDENTIFIER);
if (inputDeviceIdentifier == null) { final InputManager im = context.getSystemService(InputManager.class);
getActivity().finish(); if (NewKeyboardSettingsUtils.getInputDevice(im, inputDeviceIdentifier) == null) {
return;
} }
use(KeyboardLayoutPickerController.class).initialize(this /*parent*/, use(KeyboardLayoutPickerController.class).initialize(this /*parent*/,
inputDeviceIdentifier); inputDeviceIdentifier);
} }

View File

@@ -68,6 +68,9 @@ public class NewKeyboardLayoutEnabledLocalesFragment extends DashboardFragment
} }
private void updateCheckedState() { private void updateCheckedState() {
if (NewKeyboardSettingsUtils.getInputDevice(mIm, mInputDeviceIdentifier) == null) {
return;
}
PreferenceScreen preferenceScreen = getPreferenceScreen(); PreferenceScreen preferenceScreen = getPreferenceScreen();
preferenceScreen.removeAll(); preferenceScreen.removeAll();
List<InputMethodInfo> infoList = mImm.getEnabledInputMethodListAsUser(mUserId); List<InputMethodInfo> infoList = mImm.getEnabledInputMethodListAsUser(mUserId);
@@ -174,8 +177,8 @@ public class NewKeyboardLayoutEnabledLocalesFragment extends DashboardFragment
public void onStart() { public void onStart() {
super.onStart(); super.onStart();
mIm.registerInputDeviceListener(this, null); mIm.registerInputDeviceListener(this, null);
final InputDevice inputDevice = InputDevice inputDevice =
mIm.getInputDeviceByDescriptor(mInputDeviceIdentifier.getDescriptor()); NewKeyboardSettingsUtils.getInputDevice(mIm, mInputDeviceIdentifier);
if (inputDevice == null) { if (inputDevice == null) {
getActivity().finish(); getActivity().finish();
return; return;

View File

@@ -19,6 +19,7 @@ package com.android.settings.inputmethod;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.content.Context; import android.content.Context;
import android.hardware.input.InputDeviceIdentifier; import android.hardware.input.InputDeviceIdentifier;
import android.hardware.input.InputManager;
import android.os.Bundle; import android.os.Bundle;
import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodSubtype; import android.view.inputmethod.InputMethodSubtype;
@@ -33,25 +34,24 @@ public class NewKeyboardLayoutPickerContent extends DashboardFragment {
@Override @Override
public void onAttach(Context context) { public void onAttach(Context context) {
super.onAttach(context); super.onAttach(context);
InputManager inputManager = getContext().getSystemService(InputManager.class);
Bundle arguments = getArguments(); Bundle arguments = getArguments();
final String title = arguments.getString(NewKeyboardSettingsUtils.EXTRA_TITLE); final String title = arguments.getString(NewKeyboardSettingsUtils.EXTRA_TITLE);
final String layout = arguments.getString(NewKeyboardSettingsUtils.EXTRA_KEYBOARD_LAYOUT); final String layout = arguments.getString(NewKeyboardSettingsUtils.EXTRA_KEYBOARD_LAYOUT);
final int userId = arguments.getInt(NewKeyboardSettingsUtils.EXTRA_USER_ID); final int userId = arguments.getInt(NewKeyboardSettingsUtils.EXTRA_USER_ID);
final InputDeviceIdentifier inputDeviceIdentifier = final InputDeviceIdentifier identifier =
arguments.getParcelable(NewKeyboardSettingsUtils.EXTRA_INPUT_DEVICE_IDENTIFIER); arguments.getParcelable(NewKeyboardSettingsUtils.EXTRA_INPUT_DEVICE_IDENTIFIER);
final InputMethodInfo inputMethodInfo = final InputMethodInfo inputMethodInfo =
arguments.getParcelable(NewKeyboardSettingsUtils.EXTRA_INPUT_METHOD_INFO); arguments.getParcelable(NewKeyboardSettingsUtils.EXTRA_INPUT_METHOD_INFO);
final InputMethodSubtype inputMethodSubtype = final InputMethodSubtype inputMethodSubtype =
arguments.getParcelable(NewKeyboardSettingsUtils.EXTRA_INPUT_METHOD_SUBTYPE); arguments.getParcelable(NewKeyboardSettingsUtils.EXTRA_INPUT_METHOD_SUBTYPE);
if (identifier == null
|| NewKeyboardSettingsUtils.getInputDevice(inputManager, identifier) == null) {
if (inputDeviceIdentifier == null) { return;
getActivity().finish();
} }
getActivity().setTitle(title); getActivity().setTitle(title);
use(NewKeyboardLayoutPickerController.class).initialize(this /*parent*/, userId, use(NewKeyboardLayoutPickerController.class).initialize(this /*parent*/, userId,
inputDeviceIdentifier, inputMethodInfo, inputMethodSubtype, layout); identifier, inputMethodInfo, inputMethodSubtype, layout);
} }
@Override @Override

View File

@@ -20,7 +20,6 @@ import android.content.Context;
import android.hardware.input.InputDeviceIdentifier; import android.hardware.input.InputDeviceIdentifier;
import android.hardware.input.InputManager; import android.hardware.input.InputManager;
import android.hardware.input.KeyboardLayout; import android.hardware.input.KeyboardLayout;
import android.view.InputDevice;
import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodSubtype; import android.view.inputmethod.InputMethodSubtype;
@@ -75,13 +74,12 @@ public class NewKeyboardLayoutPickerController extends BasePreferenceController
@Override @Override
public void onStart() { public void onStart() {
mIm.registerInputDeviceListener(this, null); mIm.registerInputDeviceListener(this, null);
final InputDevice inputDevice = if (mInputDeviceIdentifier == null
mIm.getInputDeviceByDescriptor(mInputDeviceIdentifier.getDescriptor()); || NewKeyboardSettingsUtils.getInputDevice(mIm, mInputDeviceIdentifier) == null) {
if (inputDevice == null) {
mParent.getActivity().finish();
return; return;
} }
mInputDeviceId = inputDevice.getId(); mInputDeviceId =
NewKeyboardSettingsUtils.getInputDevice(mIm, mInputDeviceIdentifier).getId();
} }
@Override @Override
@@ -138,6 +136,9 @@ public class NewKeyboardLayoutPickerController extends BasePreferenceController
} }
private void createPreferenceHierarchy() { private void createPreferenceHierarchy() {
if (mKeyboardLayouts == null) {
return;
}
for (KeyboardLayout layout : mKeyboardLayouts) { for (KeyboardLayout layout : mKeyboardLayouts) {
final KeyboardLayoutPreference pref; final KeyboardLayoutPreference pref;
if (mLayout.equals(layout.getLabel())) { if (mLayout.equals(layout.getLabel())) {

View File

@@ -27,13 +27,11 @@ import com.android.settings.R;
public class NewKeyboardLayoutPickerFragment extends Fragment { public class NewKeyboardLayoutPickerFragment extends Fragment {
private ViewGroup mFragmentView;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) { Bundle savedInstanceState) {
mFragmentView = (ViewGroup) inflater.inflate( ViewGroup fragmentView = (ViewGroup) inflater.inflate(
R.layout.keyboard_layout_picker, container, false); R.layout.keyboard_layout_picker, container, false);
getActivity().getSupportFragmentManager() getActivity().getSupportFragmentManager()
.beginTransaction() .beginTransaction()
@@ -47,6 +45,6 @@ public class NewKeyboardLayoutPickerFragment extends Fragment {
.replace(R.id.keyboard_layouts, fragment) .replace(R.id.keyboard_layouts, fragment)
.commit(); .commit();
return mFragmentView; return fragmentView;
} }
} }

View File

@@ -17,6 +17,8 @@
package com.android.settings.inputmethod; package com.android.settings.inputmethod;
import android.content.Context; import android.content.Context;
import android.hardware.input.InputDeviceIdentifier;
import android.hardware.input.InputManager;
import android.view.InputDevice; import android.view.InputDevice;
import android.view.inputmethod.InputMethodInfo; import android.view.inputmethod.InputMethodInfo;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
@@ -102,4 +104,8 @@ public class NewKeyboardSettingsUtils {
return mInputMethodSubtype; return mInputMethodSubtype;
} }
} }
static InputDevice getInputDevice(InputManager im, InputDeviceIdentifier identifier) {
return im.getInputDeviceByDescriptor(identifier.getDescriptor());
}
} }

View File

@@ -160,6 +160,10 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment
final Context context = getContext(); final Context context = getContext();
ThreadUtils.postOnBackgroundThread(() -> { ThreadUtils.postOnBackgroundThread(() -> {
final List<HardKeyboardDeviceInfo> newHardKeyboards = getHardKeyboards(context); final List<HardKeyboardDeviceInfo> newHardKeyboards = getHardKeyboards(context);
if (newHardKeyboards.isEmpty()) {
getActivity().finish();
return;
}
ThreadUtils.postOnMainThread(() -> updateHardKeyboards(newHardKeyboards)); ThreadUtils.postOnMainThread(() -> updateHardKeyboards(newHardKeyboards));
}); });
} }

View File

@@ -22,6 +22,7 @@ import android.icu.text.ListFormatter;
import androidx.preference.Preference; import androidx.preference.Preference;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin; import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.inputmethod.PhysicalKeyboardFragment.HardKeyboardDeviceInfo; import com.android.settings.inputmethod.PhysicalKeyboardFragment.HardKeyboardDeviceInfo;
@@ -34,7 +35,6 @@ import com.android.settingslib.core.lifecycle.events.OnResume;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
public class PhysicalKeyboardPreferenceController extends AbstractPreferenceController public class PhysicalKeyboardPreferenceController extends AbstractPreferenceController
implements PreferenceControllerMixin, LifecycleObserver, OnResume, OnPause, implements PreferenceControllerMixin, LifecycleObserver, OnResume, OnPause,
InputManager.InputDeviceListener { InputManager.InputDeviceListener {
@@ -54,13 +54,14 @@ public class PhysicalKeyboardPreferenceController extends AbstractPreferenceCont
@Override @Override
public boolean isAvailable() { public boolean isAvailable() {
return mContext.getResources().getBoolean(R.bool.config_show_physical_keyboard_pref); return !getKeyboards().isEmpty()
&& mContext.getResources().getBoolean(R.bool.config_show_physical_keyboard_pref);
} }
@Override @Override
public void updateState(Preference preference) { public void updateState(Preference preference) {
mPreference = preference; mPreference = preference;
updateSummary(); updateEntry();
} }
@Override @Override
@@ -80,33 +81,42 @@ public class PhysicalKeyboardPreferenceController extends AbstractPreferenceCont
@Override @Override
public void onInputDeviceAdded(int deviceId) { public void onInputDeviceAdded(int deviceId) {
updateSummary(); updateEntry();
} }
@Override @Override
public void onInputDeviceRemoved(int deviceId) { public void onInputDeviceRemoved(int deviceId) {
updateSummary(); updateEntry();
} }
@Override @Override
public void onInputDeviceChanged(int deviceId) { public void onInputDeviceChanged(int deviceId) {
updateSummary(); updateEntry();
} }
private void updateSummary() { private void updateEntry() {
if (mPreference == null) { if (mPreference == null) {
return; return;
} }
final List<HardKeyboardDeviceInfo> keyboards = List<HardKeyboardDeviceInfo> keyboards = getKeyboards();
PhysicalKeyboardFragment.getHardKeyboards(mContext);
if (keyboards.isEmpty()) { if (keyboards.isEmpty()) {
mPreference.setSummary(R.string.keyboard_disconnected); mPreference.setVisible(false);
return; return;
} }
final List<String> summaries = new ArrayList<>(); updateSummary(keyboards);
}
private void updateSummary(List<HardKeyboardDeviceInfo> keyboards) {
mPreference.setVisible(true);
List<String> summaries = new ArrayList<>();
for (HardKeyboardDeviceInfo info : keyboards) { for (HardKeyboardDeviceInfo info : keyboards) {
summaries.add(info.mDeviceName); summaries.add(info.mDeviceName);
} }
mPreference.setSummary(ListFormatter.getInstance().format(summaries)); mPreference.setSummary(ListFormatter.getInstance().format(summaries));
} }
@VisibleForTesting
List<HardKeyboardDeviceInfo> getKeyboards() {
return PhysicalKeyboardFragment.getHardKeyboards(mContext);
}
} }

View File

@@ -24,12 +24,13 @@ import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import android.hardware.input.InputDeviceIdentifier;
import android.hardware.input.InputManager; import android.hardware.input.InputManager;
import android.view.InputDevice; import android.view.InputDevice;
import androidx.preference.Preference; import androidx.preference.Preference;
import com.android.settings.R; import com.android.settings.inputmethod.PhysicalKeyboardFragment.HardKeyboardDeviceInfo;
import com.android.settings.testutils.shadow.ShadowInputDevice; import com.android.settings.testutils.shadow.ShadowInputDevice;
import org.junit.After; import org.junit.After;
@@ -42,15 +43,24 @@ import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment; import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import java.util.ArrayList;
import java.util.List;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
public class PhysicalKeyboardPreferenceControllerTest { public class PhysicalKeyboardPreferenceControllerTest {
private static final String DEVICE_NAME = "deviceName";
private static final String LAYOUT_LABEL = "deviceLayutLabel";
private static final String BLUETOOTHADDRESS = "deviceBluetoothAddress";
@Mock @Mock
private Context mContext; private Context mContext;
@Mock @Mock
private InputManager mIm; private InputManager mIm;
@Mock @Mock
private Preference mPreference; private Preference mPreference;
@Mock
private InputDeviceIdentifier mIdentifier;
private PhysicalKeyboardPreferenceController mController; private PhysicalKeyboardPreferenceController mController;
@@ -69,9 +79,18 @@ public class PhysicalKeyboardPreferenceControllerTest {
@Test @Test
public void testPhysicalKeyboard_byDefault_shouldBeShown() { public void testPhysicalKeyboard_byDefault_shouldBeShown() {
final Context context = spy(RuntimeEnvironment.application.getApplicationContext()); final Context context = spy(RuntimeEnvironment.application.getApplicationContext());
mController = new PhysicalKeyboardPreferenceController(context, null); List<HardKeyboardDeviceInfo> keyboards = new ArrayList<>();
keyboards.add(new HardKeyboardDeviceInfo(
DEVICE_NAME,
mIdentifier,
LAYOUT_LABEL,
BLUETOOTHADDRESS));
mController = spy(new PhysicalKeyboardPreferenceController(context, null));
when(mController.getKeyboards()).thenReturn(keyboards);
assertThat(mController.isAvailable()).isTrue(); boolean result = mController.isAvailable();
assertThat(result).isTrue();
} }
@Test @Test
@@ -85,11 +104,11 @@ public class PhysicalKeyboardPreferenceControllerTest {
@Test @Test
@Config(shadows = ShadowInputDevice.class) @Config(shadows = ShadowInputDevice.class)
public void updateState_noKeyboard_setDisconnectedSummary() { public void updateState_noKeyboard_setPreferenceVisibleFalse() {
ShadowInputDevice.sDeviceIds = new int[0]; ShadowInputDevice.sDeviceIds = new int[0];
mController.updateState(mPreference); mController.updateState(mPreference);
verify(mPreference).setSummary(R.string.keyboard_disconnected); verify(mPreference).setVisible(false);
} }
@Test @Test