| /* |
| * 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.settingslib.inputmethod; |
| |
| import android.content.Context; |
| import android.content.pm.ApplicationInfo; |
| import android.content.pm.ResolveInfo; |
| import android.content.pm.ServiceInfo; |
| import android.support.test.InstrumentationRegistry; |
| import android.support.test.filters.SmallTest; |
| import android.support.test.runner.AndroidJUnit4; |
| import android.view.inputmethod.InputMethodInfo; |
| import android.view.inputmethod.InputMethodSubtype; |
| |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| |
| import java.text.Collator; |
| import java.util.Arrays; |
| import java.util.Collections; |
| import java.util.List; |
| import java.util.Locale; |
| |
| @SmallTest |
| @RunWith(AndroidJUnit4.class) |
| public class InputMethodPreferenceTest { |
| |
| private static final Collator COLLATOR = Collator.getInstance(Locale.US); |
| |
| @Test |
| public void testComparableOrdering() throws Exception { |
| final List<InputMethodPreference> itemsInAscendingOrder = Arrays.asList( |
| createPreference("", true, "no_title-system"), |
| createPreference("E", true, "E-system"), |
| createPreference("Z", true, "Z-system"), |
| createPreference("", false, "no_title-non_system"), |
| createPreference("E", false, "E-non_system"), |
| createPreference("Z", false, "Z-non_system") |
| ); |
| ComparableUtils.assertAscendingOrdering( |
| itemsInAscendingOrder, |
| (x, y) -> x.compareTo(y, COLLATOR), |
| x -> x.getInputMethodInfo().getServiceName()); |
| } |
| |
| @Test |
| public void testComparableEquality() { |
| final List<InputMethodPreference> itemsInSameOrder1 = Arrays.asList( |
| createPreference("", true, "no_title-system-1"), |
| createPreference("", true, "no_title-system-2") |
| ); |
| ComparableUtils.assertSameOrdering( |
| itemsInSameOrder1, |
| (x, y) -> x.compareTo(y, COLLATOR), |
| x -> x.getInputMethodInfo().getServiceName()); |
| |
| final List<InputMethodPreference> itemsInSameOrder2 = Arrays.asList( |
| createPreference("A", false, "A-non_system-1"), |
| createPreference("A", false, "A-non_system-2") |
| ); |
| ComparableUtils.assertSameOrdering( |
| itemsInSameOrder2, |
| (x, y) -> x.compareTo(y, COLLATOR), |
| x -> x.getInputMethodInfo().getServiceName()); |
| } |
| |
| @Test |
| public void testComparableContracts() { |
| final List<InputMethodPreference> items = Arrays.asList( |
| // itemsInAscendingOrder. |
| createPreference("", true, "no_title-system"), |
| createPreference("E", true, "E-system"), |
| createPreference("Z", true, "Z-system"), |
| createPreference("", false, "no_title-non_system"), |
| createPreference("E", false, "E-non_system"), |
| createPreference("Z", false, "Z-non_system"), |
| // itemsInSameOrder1. |
| createPreference("", true, "no_title-system-1"), |
| createPreference("", true, "no_title-system-2"), |
| // itemsInSameOrder2. |
| createPreference("A", false, "A-non_system-1"), |
| createPreference("A", false, "A-non_system-2") |
| ); |
| |
| ComparableUtils.assertComparableContracts( |
| items, |
| (x, y) -> x.compareTo(y, COLLATOR), |
| x -> x.getInputMethodInfo().getServiceName()); |
| } |
| |
| private static InputMethodPreference createPreference( |
| final CharSequence title, |
| final boolean systemIme, |
| final String name) { |
| return new InputMethodPreference( |
| InstrumentationRegistry.getTargetContext(), |
| createInputMethodInfo(systemIme, name), |
| title, |
| true /* isAllowedByOrganization */, |
| p -> {} /* onSavePreferenceListener */); |
| } |
| |
| private static InputMethodInfo createInputMethodInfo( |
| final boolean systemIme, final String name) { |
| final Context targetContext = InstrumentationRegistry.getTargetContext(); |
| final Locale systemLocale = targetContext |
| .getResources() |
| .getConfiguration() |
| .getLocales() |
| .get(0); |
| final InputMethodSubtype systemLocaleSubtype = |
| new InputMethodSubtype.InputMethodSubtypeBuilder() |
| .setIsAsciiCapable(true) |
| .setSubtypeLocale(systemLocale.getLanguage()) |
| .build(); |
| |
| final ResolveInfo resolveInfo = new ResolveInfo(); |
| resolveInfo.serviceInfo = new ServiceInfo(); |
| resolveInfo.serviceInfo.packageName = "com.android.ime"; |
| resolveInfo.serviceInfo.name = name; |
| resolveInfo.serviceInfo.applicationInfo = new ApplicationInfo(); |
| resolveInfo.serviceInfo.applicationInfo.enabled = true; |
| if (systemIme) { |
| resolveInfo.serviceInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM; |
| } else { |
| resolveInfo.serviceInfo.applicationInfo.flags &= ~ApplicationInfo.FLAG_SYSTEM; |
| } |
| return new InputMethodInfo( |
| resolveInfo, |
| false /* isAuxIme */, |
| "SettingsActivity", |
| Collections.singletonList(systemLocaleSubtype), |
| 0 /* isDefaultResId */, |
| true /* forceDefault */); |
| } |
| } |