diff --git a/AndroidManifest.xml b/AndroidManifest.xml index d0ed63884d4..c9045d8badd 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -3231,7 +3231,7 @@ diff --git a/res/values/attrs.xml b/res/values/attrs.xml index d37091c5948..d0ddab6ffe2 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -96,8 +96,12 @@ + + + + diff --git a/res/values/strings.xml b/res/values/strings.xml index c64880eb818..13e1364a1e2 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -4177,10 +4177,6 @@ Keyboard shortcuts helper Display available shortcuts - - %1$s - %2$s Default diff --git a/res/xml/connected_devices_advanced.xml b/res/xml/connected_devices_advanced.xml index 36eab229754..dda5655f083 100644 --- a/res/xml/connected_devices_advanced.xml +++ b/res/xml/connected_devices_advanced.xml @@ -26,7 +26,8 @@ android:icon="@drawable/ic_settings_bluetooth" android:summary="@string/bluetooth_pref_summary" android:order="-7" - settings:controller="com.android.settings.bluetooth.BluetoothSwitchPreferenceController"/> + settings:controller="com.android.settings.bluetooth.BluetoothSwitchPreferenceController" + settings:platform_slice="true"/> outerDepth)); parser.close(); @@ -205,12 +239,16 @@ public class PreferenceXmlParserUtils { * Returns the fragment name if this preference launches a child fragment. */ public static String getDataChildFragment(Context context, AttributeSet attrs) { - return getData(context, attrs, R.styleable.Preference, + return getStringData(context, attrs, R.styleable.Preference, R.styleable.Preference_android_fragment); } + /** + * Call {@link #extractMetadata(Context, int, int)} with a {@link MetadataFlag} instead. + */ + @Deprecated @Nullable - private static String getData(Context context, AttributeSet set, int[] attrs, int resId) { + private static String getStringData(Context context, AttributeSet set, int[] attrs, int resId) { final TypedArray ta = context.obtainStyledAttributes(set, attrs); String data = ta.getString(resId); ta.recycle(); @@ -243,4 +281,28 @@ public class PreferenceXmlParserUtils { } return result.toString(); } + + private static String getKey(TypedArray styledAttributes) { + return styledAttributes.getString(com.android.internal.R.styleable.Preference_key); + } + + private static String getTitle(TypedArray styledAttributes) { + return styledAttributes.getString(com.android.internal.R.styleable.Preference_title); + } + + private static String getSummary(TypedArray styledAttributes) { + return styledAttributes.getString(com.android.internal.R.styleable.Preference_summary); + } + + private static String getController(TypedArray styledAttributes) { + return styledAttributes.getString(R.styleable.Preference_controller); + } + + private static int getIcon(TypedArray styledAttributes) { + return styledAttributes.getResourceId(com.android.internal.R.styleable.Icon_icon, 0); + } + + private static boolean getPlatformSlice(TypedArray styledAttributes) { + return styledAttributes.getBoolean(R.styleable.Preference_platform_slice, false /* def */); + } } diff --git a/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment.java b/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment.java index 80d353181ba..4c9715ca467 100644 --- a/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment.java +++ b/src/com/android/settings/inputmethod/KeyboardLayoutPickerFragment.java @@ -16,43 +16,31 @@ package com.android.settings.inputmethod; -import android.annotation.Nullable; -import android.app.Activity; +import android.content.Context; import android.hardware.input.InputDeviceIdentifier; import android.hardware.input.InputManager; import android.hardware.input.InputManager.InputDeviceListener; import android.hardware.input.KeyboardLayout; import android.os.Bundle; +import android.support.v7.preference.CheckBoxPreference; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; import android.view.InputDevice; -import android.view.inputmethod.InputMethodInfo; -import android.view.inputmethod.InputMethodSubtype; -import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import com.android.internal.util.Preconditions; -import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; -import com.android.settings.inputmethod.PhysicalKeyboardFragment.KeyboardInfoPreference; import java.util.Arrays; import java.util.HashMap; import java.util.Map; -public final class KeyboardLayoutPickerFragment extends SettingsPreferenceFragment +public class KeyboardLayoutPickerFragment extends SettingsPreferenceFragment implements InputDeviceListener { - private InputDeviceIdentifier mInputDeviceIdentifier; private int mInputDeviceId = -1; private InputManager mIm; - private InputMethodInfo mImi; - @Nullable - private InputMethodSubtype mSubtype; private KeyboardLayout[] mKeyboardLayouts; - private Map mPreferenceMap = new HashMap<>(); - - // TODO: Make these constants public API for b/25752827 + private HashMap mPreferenceMap = new HashMap<>(); /** * Intent extra: The input device descriptor of the keyboard whose keyboard @@ -60,16 +48,6 @@ public final class KeyboardLayoutPickerFragment extends SettingsPreferenceFragme */ public static final String EXTRA_INPUT_DEVICE_IDENTIFIER = "input_device_identifier"; - /** - * Intent extra: The associated {@link InputMethodInfo}. - */ - public static final String EXTRA_INPUT_METHOD_INFO = "input_method_info"; - - /** - * Intent extra: The associated {@link InputMethodSubtype}. - */ - public static final String EXTRA_INPUT_METHOD_SUBTYPE = "input_method_subtype"; - @Override public int getMetricsCategory() { return MetricsEvent.INPUTMETHOD_KEYBOARD; @@ -78,18 +56,14 @@ public final class KeyboardLayoutPickerFragment extends SettingsPreferenceFragme @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); - Activity activity = Preconditions.checkNotNull(getActivity()); - mInputDeviceIdentifier = activity.getIntent().getParcelableExtra( + mInputDeviceIdentifier = getActivity().getIntent().getParcelableExtra( EXTRA_INPUT_DEVICE_IDENTIFIER); - mImi = activity.getIntent().getParcelableExtra(EXTRA_INPUT_METHOD_INFO); - mSubtype = activity.getIntent().getParcelableExtra(EXTRA_INPUT_METHOD_SUBTYPE); - - if (mInputDeviceIdentifier == null || mImi == null) { - activity.finish(); + if (mInputDeviceIdentifier == null) { + getActivity().finish(); } - mIm = activity.getSystemService(InputManager.class); + mIm = (InputManager) getSystemService(Context.INPUT_SERVICE); mKeyboardLayouts = mIm.getKeyboardLayoutsForInputDevice(mInputDeviceIdentifier); Arrays.sort(mKeyboardLayouts); setPreferenceScreen(createPreferenceHierarchy()); @@ -108,6 +82,8 @@ public final class KeyboardLayoutPickerFragment extends SettingsPreferenceFragme return; } mInputDeviceId = inputDevice.getId(); + + updateCheckedState(); } @Override @@ -120,21 +96,34 @@ public final class KeyboardLayoutPickerFragment extends SettingsPreferenceFragme @Override public boolean onPreferenceTreeClick(Preference preference) { - KeyboardLayout layout = mPreferenceMap.get(preference); - if (layout != null) { - mIm.setKeyboardLayoutForInputDevice(mInputDeviceIdentifier, mImi, mSubtype, - layout.getDescriptor()); - getActivity().finish(); - return true; + if (preference instanceof CheckBoxPreference) { + CheckBoxPreference checkboxPref = (CheckBoxPreference)preference; + KeyboardLayout layout = mPreferenceMap.get(checkboxPref); + if (layout != null) { + boolean checked = checkboxPref.isChecked(); + if (checked) { + mIm.addKeyboardLayoutForInputDevice(mInputDeviceIdentifier, + layout.getDescriptor()); + } else { + mIm.removeKeyboardLayoutForInputDevice(mInputDeviceIdentifier, + layout.getDescriptor()); + } + return true; + } } return super.onPreferenceTreeClick(preference); } @Override - public void onInputDeviceAdded(int deviceId) {} + public void onInputDeviceAdded(int deviceId) { + } @Override - public void onInputDeviceChanged(int deviceId) {} + public void onInputDeviceChanged(int deviceId) { + if (mInputDeviceId >= 0 && deviceId == mInputDeviceId) { + updateCheckedState(); + } + } @Override public void onInputDeviceRemoved(int deviceId) { @@ -147,14 +136,23 @@ public final class KeyboardLayoutPickerFragment extends SettingsPreferenceFragme PreferenceScreen root = getPreferenceManager().createPreferenceScreen(getActivity()); for (KeyboardLayout layout : mKeyboardLayouts) { - Preference pref = new Preference(getPrefContext()); + CheckBoxPreference pref = new CheckBoxPreference(getPrefContext()); pref.setTitle(layout.getLabel()); pref.setSummary(layout.getCollection()); root.addPreference(pref); mPreferenceMap.put(pref, layout); } - - root.setTitle(KeyboardInfoPreference.getDisplayName(getContext(), mImi, mSubtype)); return root; } + + private void updateCheckedState() { + String[] enabledKeyboardLayouts = mIm.getEnabledKeyboardLayoutsForInputDevice( + mInputDeviceIdentifier); + Arrays.sort(enabledKeyboardLayouts); + + for (Map.Entry entry : mPreferenceMap.entrySet()) { + entry.getKey().setChecked(Arrays.binarySearch(enabledKeyboardLayouts, + entry.getValue().getDescriptor()) >= 0); + } + } } diff --git a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java index 83d501d0a35..a02a6d035c3 100644 --- a/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java +++ b/src/com/android/settings/inputmethod/PhysicalKeyboardFragment.java @@ -19,11 +19,8 @@ package com.android.settings.inputmethod; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.Activity; -import android.app.LoaderManager; -import android.content.AsyncTaskLoader; import android.content.Context; import android.content.Intent; -import android.content.Loader; import android.database.ContentObserver; import android.hardware.input.InputDeviceIdentifier; import android.hardware.input.InputManager; @@ -40,9 +37,6 @@ import android.support.v7.preference.PreferenceCategory; import android.support.v7.preference.PreferenceScreen; import android.text.TextUtils; import android.view.InputDevice; -import android.view.inputmethod.InputMethodInfo; -import android.view.inputmethod.InputMethodManager; -import android.view.inputmethod.InputMethodSubtype; import com.android.internal.inputmethod.InputMethodUtils; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; @@ -52,33 +46,25 @@ import com.android.settings.Settings; import com.android.settings.SettingsPreferenceFragment; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; -import com.android.settingslib.inputmethod.InputMethodAndSubtypeUtil; +import com.android.settingslib.utils.ThreadUtils; import java.text.Collator; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Objects; public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment - implements InputManager.InputDeviceListener, Indexable { + implements InputManager.InputDeviceListener, + KeyboardLayoutDialogFragment.OnSetupKeyboardLayoutsListener, Indexable { private static final String KEYBOARD_ASSISTANCE_CATEGORY = "keyboard_assistance_category"; private static final String SHOW_VIRTUAL_KEYBOARD_SWITCH = "show_virtual_keyboard_switch"; private static final String KEYBOARD_SHORTCUTS_HELPER = "keyboard_shortcuts_helper"; - private static final String IM_SUBTYPE_MODE_KEYBOARD = "keyboard"; @NonNull - private final List mLastHardKeyboards = new ArrayList<>(); - @NonNull - private final List mTempKeyboardInfoList = new ArrayList<>(); - - @NonNull - private final HashSet mLoaderIDs = new HashSet<>(); - private int mNextLoaderId = 0; + private final ArrayList mLastHardKeyboards = new ArrayList<>(); private InputManager mIm; @NonNull @@ -88,6 +74,8 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment @NonNull private InputMethodUtils.InputMethodSettings mSettings; + private Intent mIntentWaitingForResult; + @Override public void onCreatePreferences(Bundle bundle, String s) { Activity activity = Preconditions.checkNotNull(getActivity()); @@ -118,9 +106,8 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment @Override public void onResume() { super.onResume(); - clearLoader(); mLastHardKeyboards.clear(); - updateHardKeyboards(); + scheduleUpdateHardKeyboards(); mIm.registerInputDeviceListener(this, null); mShowVirtualKeyboardSwitch.setOnPreferenceChangeListener( mShowVirtualKeyboardSwitchPreferenceChangeListener); @@ -130,67 +117,25 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment @Override public void onPause() { super.onPause(); - clearLoader(); mLastHardKeyboards.clear(); mIm.unregisterInputDeviceListener(this); mShowVirtualKeyboardSwitch.setOnPreferenceChangeListener(null); unregisterShowVirtualKeyboardSettingsObserver(); } - private void onLoadFinishedInternal( - final int loaderId, @NonNull final List keyboardsList) { - if (!mLoaderIDs.remove(loaderId)) { - // Already destroyed loader. Ignore. - return; - } - - Collections.sort(keyboardsList); - final PreferenceScreen preferenceScreen = getPreferenceScreen(); - preferenceScreen.removeAll(); - for (Keyboards keyboards : keyboardsList) { - final PreferenceCategory category = new PreferenceCategory(getPrefContext(), null); - category.setTitle(keyboards.mDeviceInfo.mDeviceName); - category.setOrder(0); - preferenceScreen.addPreference(category); - for (Keyboards.KeyboardInfo info : keyboards.mKeyboardInfoList) { - mTempKeyboardInfoList.clear(); - final InputMethodInfo imi = info.mImi; - final InputMethodSubtype imSubtype = info.mImSubtype; - if (imi != null) { - KeyboardInfoPreference pref = - new KeyboardInfoPreference(getPrefContext(), info); - pref.setOnPreferenceClickListener(preference -> { - showKeyboardLayoutScreen( - keyboards.mDeviceInfo.mDeviceIdentifier, imi, imSubtype); - return true; - }); - mTempKeyboardInfoList.add(pref); - Collections.sort(mTempKeyboardInfoList); - } - for (KeyboardInfoPreference pref : mTempKeyboardInfoList) { - category.addPreference(pref); - } - } - } - mTempKeyboardInfoList.clear(); - mKeyboardAssistanceCategory.setOrder(1); - preferenceScreen.addPreference(mKeyboardAssistanceCategory); - updateShowVirtualKeyboardSwitch(); - } - @Override public void onInputDeviceAdded(int deviceId) { - updateHardKeyboards(); + scheduleUpdateHardKeyboards(); } @Override public void onInputDeviceRemoved(int deviceId) { - updateHardKeyboards(); + scheduleUpdateHardKeyboards(); } @Override public void onInputDeviceChanged(int deviceId) { - updateHardKeyboards(); + scheduleUpdateHardKeyboards(); } @Override @@ -198,50 +143,57 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment return MetricsEvent.PHYSICAL_KEYBOARDS; } - @NonNull - public static List getHardKeyboards() { - final List keyboards = new ArrayList<>(); - final int[] devicesIds = InputDevice.getDeviceIds(); - for (int deviceId : devicesIds) { - final InputDevice device = InputDevice.getDevice(deviceId); - if (device != null && !device.isVirtual() && device.isFullKeyboard()) { - keyboards.add(new HardKeyboardDeviceInfo(device.getName(), device.getIdentifier())); - } - } - return keyboards; + private void scheduleUpdateHardKeyboards() { + final Context context = getContext(); + ThreadUtils.postOnBackgroundThread(() -> { + final List newHardKeyboards = getHardKeyboards(context); + ThreadUtils.postOnMainThread(() -> updateHardKeyboards(newHardKeyboards)); + }); } - private void updateHardKeyboards() { - final List newHardKeyboards = getHardKeyboards(); - if (!Objects.equals(newHardKeyboards, mLastHardKeyboards)) { - clearLoader(); - mLastHardKeyboards.clear(); - mLastHardKeyboards.addAll(newHardKeyboards); - mLoaderIDs.add(mNextLoaderId); - getLoaderManager().initLoader(mNextLoaderId, null, - new Callbacks(getContext(), this, mLastHardKeyboards)); - ++mNextLoaderId; + private void updateHardKeyboards(@NonNull List newHardKeyboards) { + if (Objects.equals(mLastHardKeyboards, newHardKeyboards)) { + // Nothing has changed. Ignore. + return; } + + // TODO(yukawa): Maybe we should follow the style used in ConnectedDeviceDashboardFragment. + + mLastHardKeyboards.clear(); + mLastHardKeyboards.addAll(newHardKeyboards); + + final PreferenceScreen preferenceScreen = getPreferenceScreen(); + preferenceScreen.removeAll(); + final PreferenceCategory category = new PreferenceCategory(getPrefContext()); + category.setTitle(R.string.builtin_keyboard_settings_title); + category.setOrder(0); + preferenceScreen.addPreference(category); + + for (HardKeyboardDeviceInfo hardKeyboardDeviceInfo : newHardKeyboards) { + // TODO(yukawa): Consider using com.android.settings.widget.GearPreference + final Preference pref = new Preference(getPrefContext()); + pref.setTitle(hardKeyboardDeviceInfo.mDeviceName); + pref.setSummary(hardKeyboardDeviceInfo.mLayoutLabel); + pref.setOnPreferenceClickListener(preference -> { + showKeyboardLayoutDialog(hardKeyboardDeviceInfo.mDeviceIdentifier); + return true; + }); + category.addPreference(pref); + } + + mKeyboardAssistanceCategory.setOrder(1); + preferenceScreen.addPreference(mKeyboardAssistanceCategory); + updateShowVirtualKeyboardSwitch(); } - private void showKeyboardLayoutScreen( - @NonNull InputDeviceIdentifier inputDeviceIdentifier, - @NonNull InputMethodInfo imi, - @Nullable InputMethodSubtype imSubtype) { - final Intent intent = new Intent(Intent.ACTION_MAIN); - intent.setClass(getActivity(), Settings.KeyboardLayoutPickerActivity.class); - intent.putExtra(KeyboardLayoutPickerFragment.EXTRA_INPUT_DEVICE_IDENTIFIER, - inputDeviceIdentifier); - intent.putExtra(KeyboardLayoutPickerFragment.EXTRA_INPUT_METHOD_INFO, imi); - intent.putExtra(KeyboardLayoutPickerFragment.EXTRA_INPUT_METHOD_SUBTYPE, imSubtype); - startActivity(intent); - } - - private void clearLoader() { - for (final int loaderId : mLoaderIDs) { - getLoaderManager().destroyLoader(loaderId); + private void showKeyboardLayoutDialog(InputDeviceIdentifier inputDeviceIdentifier) { + KeyboardLayoutDialogFragment fragment = (KeyboardLayoutDialogFragment) + getFragmentManager().findFragmentByTag("keyboardLayout"); + if (fragment == null) { + fragment = new KeyboardLayoutDialogFragment(inputDeviceIdentifier); + fragment.setTargetFragment(this, 0); + fragment.show(getActivity().getFragmentManager(), "keyboardLayout"); } - mLoaderIDs.clear(); } private void registerShowVirtualKeyboardSettingsObserver() { @@ -282,102 +234,75 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment } }; - private static final class Callbacks implements LoaderManager.LoaderCallbacks> { - @NonNull - final Context mContext; - @NonNull - final PhysicalKeyboardFragment mPhysicalKeyboardFragment; - @NonNull - final List mHardKeyboards; + @Override + public void onSetupKeyboardLayouts(InputDeviceIdentifier inputDeviceIdentifier) { + final Intent intent = new Intent(Intent.ACTION_MAIN); + intent.setClass(getActivity(), Settings.KeyboardLayoutPickerActivity.class); + intent.putExtra(KeyboardLayoutPickerFragment.EXTRA_INPUT_DEVICE_IDENTIFIER, + inputDeviceIdentifier); + mIntentWaitingForResult = intent; + startActivityForResult(intent, 0); + } - public Callbacks( - @NonNull Context context, - @NonNull PhysicalKeyboardFragment physicalKeyboardFragment, - @NonNull List hardKeyboards) { - mContext = context; - mPhysicalKeyboardFragment = physicalKeyboardFragment; - mHardKeyboards = hardKeyboards; - } + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); - @Override - public Loader> onCreateLoader(int id, Bundle args) { - return new KeyboardLayoutLoader(mContext, mHardKeyboards); - } - - @Override - public void onLoadFinished(Loader> loader, List data) { - mPhysicalKeyboardFragment.onLoadFinishedInternal(loader.getId(), data); - } - - @Override - public void onLoaderReset(Loader> loader) { + if (mIntentWaitingForResult != null) { + InputDeviceIdentifier inputDeviceIdentifier = mIntentWaitingForResult + .getParcelableExtra(KeyboardLayoutPickerFragment.EXTRA_INPUT_DEVICE_IDENTIFIER); + mIntentWaitingForResult = null; + showKeyboardLayoutDialog(inputDeviceIdentifier); } } - private static final class KeyboardLayoutLoader extends AsyncTaskLoader> { - @NonNull - private final List mHardKeyboards; - - public KeyboardLayoutLoader( - @NonNull Context context, - @NonNull List hardKeyboards) { - super(context); - mHardKeyboards = Preconditions.checkNotNull(hardKeyboards); + private static String getLayoutLabel(@NonNull InputDevice device, + @NonNull Context context, @NonNull InputManager im) { + final String currentLayoutDesc = + im.getCurrentKeyboardLayoutForInputDevice(device.getIdentifier()); + if (currentLayoutDesc == null) { + return context.getString(R.string.keyboard_layout_default_label); } + final KeyboardLayout currentLayout = im.getKeyboardLayout(currentLayoutDesc); + if (currentLayout == null) { + return context.getString(R.string.keyboard_layout_default_label); + } + // If current layout is specified but the layout is null, just return an empty string + // instead of falling back to R.string.keyboard_layout_default_label. + return TextUtils.emptyIfNull(currentLayout.getLabel()); + } - private Keyboards loadInBackground(HardKeyboardDeviceInfo deviceInfo) { - final ArrayList keyboardInfoList = new ArrayList<>(); - final InputMethodManager imm = getContext().getSystemService(InputMethodManager.class); - final InputManager im = getContext().getSystemService(InputManager.class); - if (imm != null && im != null) { - for (InputMethodInfo imi : imm.getEnabledInputMethodList()) { - final List subtypes = imm.getEnabledInputMethodSubtypeList( - imi, true /* allowsImplicitlySelectedSubtypes */); - if (subtypes.isEmpty()) { - // Here we use null to indicate that this IME has no subtype. - final InputMethodSubtype nullSubtype = null; - final KeyboardLayout layout = im.getKeyboardLayoutForInputDevice( - deviceInfo.mDeviceIdentifier, imi, nullSubtype); - keyboardInfoList.add(new Keyboards.KeyboardInfo(imi, nullSubtype, layout)); - continue; - } - - // If the IME supports subtypes, we pick up "keyboard" subtypes only. - final int N = subtypes.size(); - for (int i = 0; i < N; ++i) { - final InputMethodSubtype subtype = subtypes.get(i); - if (!IM_SUBTYPE_MODE_KEYBOARD.equalsIgnoreCase(subtype.getMode())) { - continue; - } - final KeyboardLayout layout = im.getKeyboardLayoutForInputDevice( - deviceInfo.mDeviceIdentifier, imi, subtype); - keyboardInfoList.add(new Keyboards.KeyboardInfo(imi, subtype, layout)); - } - } + @NonNull + static List getHardKeyboards(@NonNull Context context) { + final List keyboards = new ArrayList<>(); + final InputManager im = context.getSystemService(InputManager.class); + if (im == null) { + return new ArrayList<>(); + } + for (int deviceId : InputDevice.getDeviceIds()) { + final InputDevice device = InputDevice.getDevice(deviceId); + if (device == null || device.isVirtual() || !device.isFullKeyboard()) { + continue; } - return new Keyboards(deviceInfo, keyboardInfoList); + keyboards.add(new HardKeyboardDeviceInfo( + device.getName(), device.getIdentifier(), getLayoutLabel(device, context, im))); } - @Override - public List loadInBackground() { - List keyboardsList = new ArrayList<>(mHardKeyboards.size()); - for (HardKeyboardDeviceInfo deviceInfo : mHardKeyboards) { - keyboardsList.add(loadInBackground(deviceInfo)); + // We intentionally don't reuse Comparator because Collator may not be thread-safe. + final Collator collator = Collator.getInstance(); + keyboards.sort((a, b) -> { + int result = collator.compare(a.mDeviceName, b.mDeviceName); + if (result != 0) { + return result; } - return keyboardsList; - } - - @Override - protected void onStartLoading() { - super.onStartLoading(); - forceLoad(); - } - - @Override - protected void onStopLoading() { - super.onStopLoading(); - cancelLoad(); - } + result = a.mDeviceIdentifier.getDescriptor().compareTo( + b.mDeviceIdentifier.getDescriptor()); + if (result != 0) { + return result; + } + return collator.compare(a.mLayoutLabel, b.mLayoutLabel); + }); + return keyboards; } public static final class HardKeyboardDeviceInfo { @@ -385,12 +310,16 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment public final String mDeviceName; @NonNull public final InputDeviceIdentifier mDeviceIdentifier; + @NonNull + public final String mLayoutLabel; public HardKeyboardDeviceInfo( - @Nullable final String deviceName, - @NonNull final InputDeviceIdentifier deviceIdentifier) { - mDeviceName = deviceName != null ? deviceName : ""; + @Nullable String deviceName, + @NonNull InputDeviceIdentifier deviceIdentifier, + @NonNull String layoutLabel) { + mDeviceName = TextUtils.emptyIfNull(deviceName); mDeviceIdentifier = deviceIdentifier; + mLayoutLabel = layoutLabel; } @Override @@ -404,14 +333,10 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment if (!TextUtils.equals(mDeviceName, that.mDeviceName)) { return false; } - if (mDeviceIdentifier.getVendorId() != that.mDeviceIdentifier.getVendorId()) { + if (!Objects.equals(mDeviceIdentifier, that.mDeviceIdentifier)) { return false; } - if (mDeviceIdentifier.getProductId() != that.mDeviceIdentifier.getProductId()) { - return false; - } - if (!TextUtils.equals(mDeviceIdentifier.getDescriptor(), - that.mDeviceIdentifier.getDescriptor())) { + if (!TextUtils.equals(mLayoutLabel, that.mLayoutLabel)) { return false; } @@ -419,121 +344,6 @@ public final class PhysicalKeyboardFragment extends SettingsPreferenceFragment } } - public static final class Keyboards implements Comparable { - @NonNull - public final HardKeyboardDeviceInfo mDeviceInfo; - @NonNull - public final ArrayList mKeyboardInfoList; - @NonNull - public final Collator mCollator = Collator.getInstance(); - - public Keyboards( - @NonNull final HardKeyboardDeviceInfo deviceInfo, - @NonNull final ArrayList keyboardInfoList) { - mDeviceInfo = deviceInfo; - mKeyboardInfoList = keyboardInfoList; - } - - @Override - public int compareTo(@NonNull Keyboards another) { - return mCollator.compare(mDeviceInfo.mDeviceName, another.mDeviceInfo.mDeviceName); - } - - public static final class KeyboardInfo { - @NonNull - public final InputMethodInfo mImi; - @Nullable - public final InputMethodSubtype mImSubtype; - @NonNull - public final KeyboardLayout mLayout; - - public KeyboardInfo( - @NonNull final InputMethodInfo imi, - @Nullable final InputMethodSubtype imSubtype, - @NonNull final KeyboardLayout layout) { - mImi = imi; - mImSubtype = imSubtype; - mLayout = layout; - } - } - } - - static final class KeyboardInfoPreference extends Preference { - - @NonNull - private final CharSequence mImeName; - @Nullable - private final CharSequence mImSubtypeName; - @NonNull - private final Collator collator = Collator.getInstance(); - - private KeyboardInfoPreference( - @NonNull Context context, @NonNull Keyboards.KeyboardInfo info) { - super(context); - mImeName = info.mImi.loadLabel(context.getPackageManager()); - mImSubtypeName = getImSubtypeName(context, info.mImi, info.mImSubtype); - setTitle(formatDisplayName(context, mImeName, mImSubtypeName)); - if (info.mLayout != null) { - setSummary(info.mLayout.getLabel()); - } - } - - @NonNull - static CharSequence getDisplayName( - @NonNull Context context, @NonNull InputMethodInfo imi, - @Nullable InputMethodSubtype imSubtype) { - final CharSequence imeName = imi.loadLabel(context.getPackageManager()); - final CharSequence imSubtypeName = getImSubtypeName(context, imi, imSubtype); - return formatDisplayName(context, imeName, imSubtypeName); - } - - private static CharSequence formatDisplayName( - @NonNull Context context, - @NonNull CharSequence imeName, @Nullable CharSequence imSubtypeName) { - if (imSubtypeName == null) { - return imeName; - } - return String.format( - context.getString(R.string.physical_device_title), imeName, imSubtypeName); - } - - @Nullable - private static CharSequence getImSubtypeName( - @NonNull Context context, @NonNull InputMethodInfo imi, - @Nullable InputMethodSubtype imSubtype) { - if (imSubtype != null) { - return InputMethodAndSubtypeUtil.getSubtypeLocaleNameAsSentence( - imSubtype, context, imi); - } - return null; - } - - @Override - public int compareTo(@NonNull Preference object) { - if (!(object instanceof KeyboardInfoPreference)) { - return super.compareTo(object); - } - KeyboardInfoPreference another = (KeyboardInfoPreference) object; - int result = compare(mImeName, another.mImeName); - if (result == 0) { - result = compare(mImSubtypeName, another.mImSubtypeName); - } - return result; - } - - private int compare(@Nullable CharSequence lhs, @Nullable CharSequence rhs) { - if (!TextUtils.isEmpty(lhs) && !TextUtils.isEmpty(rhs)) { - return collator.compare(lhs.toString(), rhs.toString()); - } else if (TextUtils.isEmpty(lhs) && TextUtils.isEmpty(rhs)) { - return 0; - } else if (!TextUtils.isEmpty(lhs)) { - return -1; - } else { - return 1; - } - } - } - public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider() { @Override diff --git a/src/com/android/settings/inputmethod/PhysicalKeyboardPreferenceController.java b/src/com/android/settings/inputmethod/PhysicalKeyboardPreferenceController.java index f80b68f3237..b9e95bee194 100644 --- a/src/com/android/settings/inputmethod/PhysicalKeyboardPreferenceController.java +++ b/src/com/android/settings/inputmethod/PhysicalKeyboardPreferenceController.java @@ -94,7 +94,7 @@ public class PhysicalKeyboardPreferenceController extends AbstractPreferenceCont return; } final List keyboards = - PhysicalKeyboardFragment.getHardKeyboards(); + PhysicalKeyboardFragment.getHardKeyboards(mContext); if (keyboards.isEmpty()) { mPreference.setSummary(R.string.disconnected); return; diff --git a/src/com/android/settings/slices/SettingsSliceProvider.java b/src/com/android/settings/slices/SettingsSliceProvider.java index d8ba991a145..68c9731d8cb 100644 --- a/src/com/android/settings/slices/SettingsSliceProvider.java +++ b/src/com/android/settings/slices/SettingsSliceProvider.java @@ -24,6 +24,7 @@ import android.content.Intent; import android.graphics.drawable.Icon; import android.net.Uri; import android.net.wifi.WifiManager; +import android.provider.SettingsSlicesContract; import android.support.annotation.VisibleForTesting; import android.util.Log; @@ -63,6 +64,10 @@ public class SettingsSliceProvider extends SliceProvider { private static final String TAG = "SettingsSliceProvider"; + /** + * Authority for Settings slices not officially supported by the platform, but extensible for + * OEMs. + */ public static final String SLICE_AUTHORITY = "com.android.settings.slices"; public static final String PATH_WIFI = "wifi"; @@ -82,13 +87,6 @@ public class SettingsSliceProvider extends SliceProvider { @VisibleForTesting Map mSliceDataCache; - public static Uri getUri(String path) { - return new Uri.Builder() - .scheme(ContentResolver.SCHEME_CONTENT) - .authority(SLICE_AUTHORITY) - .appendPath(path).build(); - } - @Override public boolean onCreateSliceProvider() { mSlicesDatabaseAccessor = new SlicesDatabaseAccessor(getContext()); @@ -176,7 +174,8 @@ public class SettingsSliceProvider extends SliceProvider { .setSubtitle(state) .addEndItem(new SliceAction(getBroadcastIntent(ACTION_WIFI_CHANGED), null, finalWifiEnabled)) - .setPrimaryAction(new SliceAction(getIntent(Intent.ACTION_MAIN), null, null))) + .setPrimaryAction( + new SliceAction(getIntent(Intent.ACTION_MAIN), null, null))) .build(); } diff --git a/src/com/android/settings/slices/SliceBroadcastReceiver.java b/src/com/android/settings/slices/SliceBroadcastReceiver.java index a68ed19db1d..4124df7718c 100644 --- a/src/com/android/settings/slices/SliceBroadcastReceiver.java +++ b/src/com/android/settings/slices/SliceBroadcastReceiver.java @@ -59,7 +59,8 @@ public class SliceBroadcastReceiver extends BroadcastReceiver { // Wait a bit for wifi to update (TODO: is there a better way to do this?) Handler h = new Handler(); h.postDelayed(() -> { - Uri uri = SettingsSliceProvider.getUri(SettingsSliceProvider.PATH_WIFI); + Uri uri = SliceBuilderUtils.getUri(SettingsSliceProvider.PATH_WIFI, + false /* isPlatformSlice */); context.getContentResolver().notifyChange(uri, null); }, 1000); break; diff --git a/src/com/android/settings/slices/SliceBuilderUtils.java b/src/com/android/settings/slices/SliceBuilderUtils.java index e94ee56ddc6..e90ea8e9f68 100644 --- a/src/com/android/settings/slices/SliceBuilderUtils.java +++ b/src/com/android/settings/slices/SliceBuilderUtils.java @@ -19,9 +19,12 @@ package com.android.settings.slices; import static com.android.settings.slices.SettingsSliceProvider.EXTRA_SLICE_KEY; import android.app.PendingIntent; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.graphics.drawable.Icon; +import android.net.Uri; +import android.provider.SettingsSlicesContract; import android.text.TextUtils; import com.android.internal.annotations.VisibleForTesting; @@ -98,6 +101,17 @@ public class SliceBuilderUtils { sliceData.getKey()); } + public static Uri getUri(String path, boolean isPlatformSlice) { + final String authority = isPlatformSlice + ? SettingsSlicesContract.AUTHORITY + : SettingsSliceProvider.SLICE_AUTHORITY; + return new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(authority) + .appendPath(path) + .build(); + } + private static BasePreferenceController getPreferenceController(Context context, String controllerClassName, String controllerKey) { try { diff --git a/src/com/android/settings/slices/SliceData.java b/src/com/android/settings/slices/SliceData.java index a7c9a116dad..c02b1135699 100644 --- a/src/com/android/settings/slices/SliceData.java +++ b/src/com/android/settings/slices/SliceData.java @@ -70,6 +70,8 @@ public class SliceData { @SliceType private final int mSliceType; + private final boolean mIsPlatformDefined; + public String getKey() { return mKey; } @@ -106,6 +108,10 @@ public class SliceData { return mSliceType; } + public boolean isPlatformDefined() { + return mIsPlatformDefined; + } + private SliceData(Builder builder) { mKey = builder.mKey; mTitle = builder.mTitle; @@ -116,6 +122,7 @@ public class SliceData { mUri = builder.mUri; mPreferenceController = builder.mPrefControllerClassName; mSliceType = builder.mSliceType; + mIsPlatformDefined = builder.mIsPlatformDefined; } @Override @@ -151,6 +158,8 @@ public class SliceData { private int mSliceType; + private boolean mIsPlatformDefined; + public Builder setKey(String key) { mKey = key; return this; @@ -196,6 +205,11 @@ public class SliceData { return this; } + public Builder setPlatformDefined(boolean isPlatformDefined) { + mIsPlatformDefined = isPlatformDefined; + return this; + } + public SliceData build() { if (TextUtils.isEmpty(mKey)) { throw new IllegalStateException("Key cannot be empty"); diff --git a/src/com/android/settings/slices/SliceDataConverter.java b/src/com/android/settings/slices/SliceDataConverter.java index e7b53d03940..7cf1994f9ed 100644 --- a/src/com/android/settings/slices/SliceDataConverter.java +++ b/src/com/android/settings/slices/SliceDataConverter.java @@ -19,6 +19,7 @@ package com.android.settings.slices; import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_CONTROLLER; import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_ICON; import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_KEY; +import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_PLATFORM_SLICE_FLAG; import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_SUMMARY; import static com.android.settings.core.PreferenceXmlParserUtils.METADATA_TITLE; @@ -164,7 +165,8 @@ class SliceDataConverter { | MetadataFlag.FLAG_NEED_PREF_TYPE | MetadataFlag.FLAG_NEED_PREF_TITLE | MetadataFlag.FLAG_NEED_PREF_ICON - | MetadataFlag.FLAG_NEED_PREF_SUMMARY); + | MetadataFlag.FLAG_NEED_PREF_SUMMARY + | MetadataFlag.FLAG_NEED_PLATFORM_SLICE_FLAG); for (Bundle bundle : metadata) { // TODO (b/67996923) Non-controller Slices should become intent-only slices. @@ -179,6 +181,7 @@ class SliceDataConverter { final int iconResId = bundle.getInt(METADATA_ICON); final int sliceType = SliceBuilderUtils.getSliceType(mContext, controllerClassName, key); + final boolean isPlatformSlice = bundle.getBoolean(METADATA_PLATFORM_SLICE_FLAG); final SliceData xmlSlice = new SliceData.Builder() .setKey(key) @@ -189,6 +192,7 @@ class SliceDataConverter { .setPreferenceControllerClassName(controllerClassName) .setFragmentName(fragmentName) .setSliceType(sliceType) + .setPlatformDefined(isPlatformSlice) .build(); xmlSliceData.add(xmlSlice); diff --git a/tests/robotests/res/xml-mcc999/location_settings.xml b/tests/robotests/res/xml-mcc999/location_settings.xml index de77bfae006..e04f1be9b2d 100644 --- a/tests/robotests/res/xml-mcc999/location_settings.xml +++ b/tests/robotests/res/xml-mcc999/location_settings.xml @@ -24,6 +24,7 @@ android:title="title" android:icon="@drawable/ic_android" android:summary="summary" - settings:controller="com.android.settings.slices.FakePreferenceController"/> + settings:controller="com.android.settings.slices.FakePreferenceController" + settings:platform_slice="true"/> \ No newline at end of file diff --git a/tests/robotests/src/com/android/settings/inputmethod/PhysicalKeyboardPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/inputmethod/PhysicalKeyboardPreferenceControllerTest.java index 13c99a63730..3c8f3c48851 100644 --- a/tests/robotests/src/com/android/settings/inputmethod/PhysicalKeyboardPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/inputmethod/PhysicalKeyboardPreferenceControllerTest.java @@ -55,7 +55,7 @@ public class PhysicalKeyboardPreferenceControllerTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); - when(mContext.getSystemService(Context.INPUT_SERVICE)).thenReturn(mIm); + when(mContext.getSystemService(InputManager.class)).thenReturn(mIm); mController = new PhysicalKeyboardPreferenceController(mContext, null /* lifecycle */); } diff --git a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java index 50f47ff7801..9edae7e39cb 100644 --- a/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java +++ b/tests/robotests/src/com/android/settings/slices/SettingsSliceProviderTest.java @@ -18,8 +18,7 @@ package com.android.settings.slices; import static com.google.common.truth.Truth.assertThat; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; + import static org.mockito.Mockito.spy; import static org.mockito.Mockito.when; @@ -28,6 +27,7 @@ import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; +import android.provider.SettingsSlicesContract; import com.android.settings.testutils.DatabaseTestUtils; import com.android.settings.testutils.FakeToggleController; @@ -50,6 +50,8 @@ import java.util.HashMap; public class SettingsSliceProviderTest { private final String KEY = "KEY"; + private final String INTENT_PATH = SettingsSlicesContract.PATH_SETTING_INTENT + "/" + KEY; + private final String ACTION_PATH = SettingsSlicesContract.PATH_SETTING_ACTION + "/" + KEY; private final String TITLE = "title"; private final String SUMMARY = "summary"; private final String SCREEN_TITLE = "screen title"; @@ -67,6 +69,8 @@ public class SettingsSliceProviderTest { mProvider = spy(new SettingsSliceProvider()); mProvider.mSliceDataCache = new HashMap<>(); mProvider.mSlicesDatabaseAccessor = new SlicesDatabaseAccessor(mContext); + when(mProvider.getContext()).thenReturn(mContext); + mDb = SlicesDatabaseHelper.getInstance(mContext).getWritableDatabase(); SlicesDatabaseHelper.getInstance(mContext).setIndexedState(); } @@ -78,34 +82,18 @@ public class SettingsSliceProviderTest { @Test public void testInitialSliceReturned_emptySlice() { - insertSpecialCase(KEY); - ContentResolver mockResolver = mock(ContentResolver.class); - doReturn(mockResolver).when(mContext).getContentResolver(); - when(mProvider.getContext()).thenReturn(mContext); - - Uri uri = SettingsSliceProvider.getUri(KEY); + insertSpecialCase(INTENT_PATH); + Uri uri = SliceBuilderUtils.getUri(INTENT_PATH, false); Slice slice = mProvider.onBindSlice(uri); assertThat(slice.getUri()).isEqualTo(uri); assertThat(slice.getItems()).isEmpty(); } - @Test - public void testUriBuilder_returnsValidSliceUri() { - Uri uri = SettingsSliceProvider.getUri(KEY); - - assertThat(uri.getScheme()).isEqualTo(ContentResolver.SCHEME_CONTENT); - assertThat(uri.getAuthority()).isEqualTo(SettingsSliceProvider.SLICE_AUTHORITY); - assertThat(uri.getLastPathSegment()).isEqualTo(KEY); - } - @Test public void testLoadSlice_returnsSliceFromAccessor() { - ContentResolver mockResolver = mock(ContentResolver.class); - doReturn(mockResolver).when(mContext).getContentResolver(); - when(mProvider.getContext()).thenReturn(mContext); insertSpecialCase(KEY); - Uri uri = SettingsSliceProvider.getUri(KEY); + Uri uri = SliceBuilderUtils.getUri(KEY, false); mProvider.loadSlice(uri); SliceData data = mProvider.mSliceDataCache.get(uri); @@ -116,7 +104,6 @@ public class SettingsSliceProviderTest { @Test public void testLoadSlice_cachedEntryRemovedOnBuild() { - when(mProvider.getContext()).thenReturn(mContext); SliceData data = getDummyData(); mProvider.mSliceDataCache.put(data.getUri(), data); mProvider.onBindSlice(data.getUri()); diff --git a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java index 5a2271aadd2..0fcce5fb19a 100644 --- a/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java +++ b/tests/robotests/src/com/android/settings/slices/SliceBuilderUtilsTest.java @@ -20,8 +20,10 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.spy; +import android.content.ContentResolver; import android.content.Context; import android.net.Uri; +import android.provider.SettingsSlicesContract; import com.android.settings.R; import com.android.settings.core.BasePreferenceController; @@ -48,6 +50,9 @@ public class SliceBuilderUtilsTest { private final Class PREF_CONTROLLER = FakeToggleController.class; private final Class PREF_CONTROLLER2 = FakeContextOnlyPreferenceController.class; + private final String INTENT_PATH = SettingsSlicesContract.PATH_SETTING_INTENT + "/" + KEY; + private final String ACTION_PATH = SettingsSlicesContract.PATH_SETTING_ACTION + "/" + KEY; + private Context mContext; @Before @@ -62,6 +67,58 @@ public class SliceBuilderUtilsTest { assertThat(slice).isNotNull(); // TODO improve test for Slice content } + @Test + public void testUriBuilder_oemAuthority_intentPath_returnsValidSliceUri() { + Uri expectedUri = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSliceProvider.SLICE_AUTHORITY) + .appendPath(INTENT_PATH) + .build(); + + Uri actualUri = SliceBuilderUtils.getUri(INTENT_PATH, false); + + assertThat(actualUri).isEqualTo(expectedUri); + } + + @Test + public void testUriBuilder_oemAuthority_actionPath_returnsValidSliceUri() { + Uri expectedUri = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSliceProvider.SLICE_AUTHORITY) + .appendPath(ACTION_PATH) + .build(); + + Uri actualUri = SliceBuilderUtils.getUri(ACTION_PATH, false); + + assertThat(actualUri).isEqualTo(expectedUri); + } + + @Test + public void testUriBuilder_platformAuthority_intentPath_returnsValidSliceUri() { + Uri expectedUri = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSlicesContract.AUTHORITY) + .appendPath(ACTION_PATH) + .build(); + + Uri actualUri = SliceBuilderUtils.getUri(ACTION_PATH, true); + + assertThat(actualUri).isEqualTo(expectedUri); + } + + @Test + public void testUriBuilder_platformAuthority_actionPath_returnsValidSliceUri() { + Uri expectedUri = new Uri.Builder() + .scheme(ContentResolver.SCHEME_CONTENT) + .authority(SettingsSlicesContract.AUTHORITY) + .appendPath(ACTION_PATH) + .build(); + + Uri actualUri = SliceBuilderUtils.getUri(ACTION_PATH, true); + + assertThat(actualUri).isEqualTo(expectedUri); + } + @Test public void testGetPreferenceController_buildsMatchingController() { BasePreferenceController controller = diff --git a/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java b/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java index 4d6c08dda8b..36c27548c13 100644 --- a/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java +++ b/tests/robotests/src/com/android/settings/slices/SliceDataConverterTest.java @@ -81,6 +81,7 @@ public class SliceDataConverterTest { assertThat(fakeSlice.getUri()).isNull(); assertThat(fakeSlice.getFragmentClassName()).isEqualTo(fakeFragmentClassName); assertThat(fakeSlice.getPreferenceController()).isEqualTo(fakeControllerName); - assertThat(fakeSlice.getSliceType()).isEqualTo(SliceData.SliceType.SLIDER); + assertThat(fakeSlice.getSliceType()).isEqualTo(SliceData.SliceType.SLIDER); // from XML + assertThat(fakeSlice.isPlatformDefined()).isTrue(); // from XML } } \ No newline at end of file diff --git a/tests/robotests/src/com/android/settings/slices/SliceDataTest.java b/tests/robotests/src/com/android/settings/slices/SliceDataTest.java index 7cd19b5bcf7..c2ab0afb183 100644 --- a/tests/robotests/src/com/android/settings/slices/SliceDataTest.java +++ b/tests/robotests/src/com/android/settings/slices/SliceDataTest.java @@ -37,6 +37,7 @@ public class SliceDataTest { private final Uri URI = Uri.parse("content://com.android.settings.slices/test"); private final String PREF_CONTROLLER = "com.android.settings.slices.tester"; private final int SLICE_TYPE = SliceData.SliceType.SWITCH; + private final boolean IS_PLATFORM_DEFINED = true; @Test public void testBuilder_buildsMatchingObject() { @@ -49,7 +50,8 @@ public class SliceDataTest { .setFragmentName(FRAGMENT_NAME) .setUri(URI) .setPreferenceControllerClassName(PREF_CONTROLLER) - .setSliceType(SLICE_TYPE); + .setSliceType(SLICE_TYPE) + .setPlatformDefined(IS_PLATFORM_DEFINED); SliceData data = builder.build(); @@ -62,6 +64,7 @@ public class SliceDataTest { assertThat(data.getUri()).isEqualTo(URI); assertThat(data.getPreferenceController()).isEqualTo(PREF_CONTROLLER); assertThat(data.getSliceType()).isEqualTo(SLICE_TYPE); + assertThat(data.isPlatformDefined()).isEqualTo(IS_PLATFORM_DEFINED); } @Test(expected = IllegalStateException.class) diff --git a/tests/robotests/src/com/android/settings/slices/SlicesDatabaseAccessorTest.java b/tests/robotests/src/com/android/settings/slices/SlicesDatabaseAccessorTest.java index 8989de9ef7f..331058c96c5 100644 --- a/tests/robotests/src/com/android/settings/slices/SlicesDatabaseAccessorTest.java +++ b/tests/robotests/src/com/android/settings/slices/SlicesDatabaseAccessorTest.java @@ -90,7 +90,7 @@ public class SlicesDatabaseAccessorTest { public void testGetSliceFromUri_validUri_validSliceReturned() { String key = "key"; insertSpecialCase(key); - Uri uri = SettingsSliceProvider.getUri(key); + Uri uri = SliceBuilderUtils.getUri(key, false); SliceData data = mAccessor.getSliceDataFromUri(uri); @@ -106,7 +106,7 @@ public class SlicesDatabaseAccessorTest { @Test(expected = IllegalStateException.class) public void testGetSliceFromUri_invalidUri_errorThrown() { - Uri uri = SettingsSliceProvider.getUri("durr"); + Uri uri = SliceBuilderUtils.getUri("durr", false); mAccessor.getSliceDataFromUri(uri); }