Set preference visible to false when there is no keyboard.

1. Physical keyboard settings should only show up if at least one PK is connected.
2. Update tests.
3. Fix NullPointerException.

Bug: 269983475
Bug: 270109384
Bug: 271357910
Test: atest and manual
Change-Id: If7798587fb386dbf669fc249cab304d91a26879b
This commit is contained in:
danielwbhuang
2023-02-24 18:16:30 +08:00
parent fa57dd3f2e
commit 1f3261467d
11 changed files with 93 additions and 48 deletions

View File

@@ -22,6 +22,7 @@ import android.icu.text.ListFormatter;
import androidx.preference.Preference;
import com.android.internal.annotations.VisibleForTesting;
import com.android.settings.R;
import com.android.settings.core.PreferenceControllerMixin;
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.List;
public class PhysicalKeyboardPreferenceController extends AbstractPreferenceController
implements PreferenceControllerMixin, LifecycleObserver, OnResume, OnPause,
InputManager.InputDeviceListener {
@@ -54,13 +54,14 @@ public class PhysicalKeyboardPreferenceController extends AbstractPreferenceCont
@Override
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
public void updateState(Preference preference) {
mPreference = preference;
updateSummary();
updateEntry();
}
@Override
@@ -80,33 +81,42 @@ public class PhysicalKeyboardPreferenceController extends AbstractPreferenceCont
@Override
public void onInputDeviceAdded(int deviceId) {
updateSummary();
updateEntry();
}
@Override
public void onInputDeviceRemoved(int deviceId) {
updateSummary();
updateEntry();
}
@Override
public void onInputDeviceChanged(int deviceId) {
updateSummary();
updateEntry();
}
private void updateSummary() {
private void updateEntry() {
if (mPreference == null) {
return;
}
final List<HardKeyboardDeviceInfo> keyboards =
PhysicalKeyboardFragment.getHardKeyboards(mContext);
List<HardKeyboardDeviceInfo> keyboards = getKeyboards();
if (keyboards.isEmpty()) {
mPreference.setSummary(R.string.keyboard_disconnected);
mPreference.setVisible(false);
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) {
summaries.add(info.mDeviceName);
}
mPreference.setSummary(ListFormatter.getInstance().format(summaries));
}
@VisibleForTesting
List<HardKeyboardDeviceInfo> getKeyboards() {
return PhysicalKeyboardFragment.getHardKeyboards(mContext);
}
}