From 3720e0c4f1005242ff3b368b8f917eb5ca7d398b Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Tue, 21 Mar 2017 15:15:27 -0700 Subject: [PATCH] Update system setting page subtext - Move android version from about phone subtext to system update - Updates strings for autofill, keyboard & input, factory reset, swipe for notification - Add a new pref category for spell checker and personal dictionary - Display "None" if any default app is not selected - Display current keyboard type as language subtext Bug: 36395109 Test: make RunSettingsRoboTests Change-Id: Id6ca94ea31e55f1c1ec04e47dcf657a25c35c7fe --- AndroidManifest.xml | 4 +- res/values/strings.xml | 16 +++---- res/xml/language_and_input.xml | 27 ++++++----- res/xml/system_dashboard_fragment.xml | 4 +- .../android/settings/DeviceInfoSettings.java | 30 ------------ .../DefaultAppPreferenceController.java | 3 +- .../SystemUpdatePreferenceController.java | 8 ++++ .../language/LanguageAndInputSettings.java | 46 ++++++++++++++++++- .../DefaultAppPreferenceControllerTest.java | 3 +- ...faultAutofillPreferenceControllerTest.java | 3 +- ...efaultBrowserPreferenceControllerTest.java | 3 +- .../SystemUpdatePreferenceControllerTest.java | 21 ++++++++- .../LanguageAndInputSettingsTest.java | 42 ++++++++++++++++- 13 files changed, 148 insertions(+), 62 deletions(-) diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 07d8e237ba6..0404d0b5f2c 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -565,8 +565,6 @@ - + Network settings have been reset - - Reset device Factory data reset @@ -3769,6 +3767,8 @@ Languages & input Languages & input + + Input assistance Keyboard & input methods @@ -3815,7 +3815,7 @@ Failed to open settings for %1$s - Keyboard and input methods + Keyboard & inputs Virtual keyboards @@ -7536,7 +7536,7 @@ Back up disabled - Android %1$s + Updated to Android %1$s Action not allowed @@ -8119,8 +8119,8 @@ To quickly check your notifications, pick up your device. - - Swipe for notifications + + Swipe fingerprint for notifications To check your notifications, swipe down on the fingerprint sensor on the back of your phone. @@ -8318,8 +8318,8 @@ (disabled for user %s) - - Autofill app + + Autofill service auto, fill, autofill diff --git a/res/xml/language_and_input.xml b/res/xml/language_and_input.xml index 6303fbd3839..c85a4d1bf6b 100644 --- a/res/xml/language_and_input.xml +++ b/res/xml/language_and_input.xml @@ -34,19 +34,22 @@ android:fragment="com.android.settings.inputmethod.PhysicalKeyboardFragment"/> - - - + + + + - - + + + @@ -41,7 +41,7 @@ buildPreferenceControllers(Context context, Activity activity, Fragment fragment, Lifecycle lifecycle) { final List controllers = new ArrayList<>(); diff --git a/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java b/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java index d8fb2257753..4c65fca0a5b 100644 --- a/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java +++ b/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceController.java @@ -24,6 +24,7 @@ import android.support.v7.preference.Preference; import android.text.TextUtils; import android.util.Log; +import com.android.settings.R; import com.android.settings.applications.PackageManagerWrapper; import com.android.settings.applications.PackageManagerWrapperImpl; import com.android.settings.core.PreferenceController; @@ -56,7 +57,7 @@ public abstract class DefaultAppPreferenceController extends PreferenceControlle preference.setSummary(defaultAppLabel); } else { Log.d(TAG, "No default app"); - preference.setSummary(null); + preference.setSummary(R.string.app_list_preference_none); } mayUpdateGearIcon(app, preference); } diff --git a/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java b/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java index 4fcacd87dcb..c2e2ad83428 100644 --- a/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java +++ b/src/com/android/settings/deviceinfo/SystemUpdatePreferenceController.java @@ -17,6 +17,7 @@ package com.android.settings.deviceinfo; import android.content.Context; import android.content.Intent; +import android.os.Build; import android.os.PersistableBundle; import android.os.UserManager; import android.support.v7.preference.Preference; @@ -25,6 +26,7 @@ import android.telephony.CarrierConfigManager; import android.text.TextUtils; import android.util.Log; +import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.core.PreferenceController; @@ -78,6 +80,12 @@ public class SystemUpdatePreferenceController extends PreferenceController { return false; } + @Override + public void updateState(Preference preference) { + preference.setSummary(mContext.getString(R.string.about_summary, + Build.VERSION.RELEASE)); + } + /** * Trigger client initiated action (send intent) on system update */ diff --git a/src/com/android/settings/language/LanguageAndInputSettings.java b/src/com/android/settings/language/LanguageAndInputSettings.java index ef9f84b933f..84f4e50d930 100644 --- a/src/com/android/settings/language/LanguageAndInputSettings.java +++ b/src/com/android/settings/language/LanguageAndInputSettings.java @@ -16,11 +16,17 @@ package com.android.settings.language; +import android.content.ComponentName; import android.content.Context; +import android.content.pm.PackageManager; import android.os.UserHandle; import android.provider.SearchIndexableResource; +import android.provider.Settings; import android.speech.tts.TtsEngines; import android.support.annotation.VisibleForTesting; +import android.text.TextUtils; +import android.view.inputmethod.InputMethodInfo; +import android.view.inputmethod.InputMethodManager; import com.android.internal.hardware.AmbientDisplayConfiguration; import com.android.internal.logging.nano.MetricsProto; @@ -28,14 +34,15 @@ import com.android.settings.R; import com.android.settings.core.PreferenceController; import com.android.settings.core.lifecycle.Lifecycle; import com.android.settings.dashboard.DashboardFragment; +import com.android.settings.dashboard.SummaryLoader; import com.android.settings.gestures.AssistGesturePreferenceController; import com.android.settings.gestures.DoubleTapPowerPreferenceController; import com.android.settings.gestures.DoubleTapScreenPreferenceController; import com.android.settings.gestures.DoubleTwistPreferenceController; import com.android.settings.gestures.PickupGesturePreferenceController; +import com.android.settings.gestures.SwipeToNotificationPreferenceController; import com.android.settings.inputmethod.GameControllerPreferenceController; import com.android.settings.inputmethod.SpellCheckerPreferenceController; -import com.android.settings.gestures.SwipeToNotificationPreferenceController; import com.android.settings.search.BaseSearchIndexProvider; import java.util.ArrayList; @@ -104,6 +111,43 @@ public class LanguageAndInputSettings extends DashboardFragment { mAmbientDisplayConfig = ambientConfig; } + private static class SummaryProvider implements SummaryLoader.SummaryProvider { + + private final Context mContext; + private final SummaryLoader mSummaryLoader; + + public SummaryProvider(Context context, SummaryLoader summaryLoader) { + mContext = context; + mSummaryLoader = summaryLoader; + } + + @Override + public void setListening(boolean listening) { + if (listening) { + final String flattenComponent = Settings.Secure.getString( + mContext.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD); + if (!TextUtils.isEmpty(flattenComponent)) { + final PackageManager packageManage = mContext.getPackageManager(); + final String pkg = ComponentName.unflattenFromString(flattenComponent) + .getPackageName(); + final InputMethodManager imm = (InputMethodManager) mContext.getSystemService( + Context.INPUT_METHOD_SERVICE); + final List imis = imm.getInputMethodList(); + for (InputMethodInfo imi : imis) { + if (TextUtils.equals(imi.getPackageName(), pkg)) { + mSummaryLoader.setSummary(this, imi.loadLabel(packageManage)); + return; + } + } + } + mSummaryLoader.setSummary(this, ""); + } + } + } + + public static final SummaryLoader.SummaryProviderFactory SUMMARY_PROVIDER_FACTORY + = (activity, summaryLoader) -> new SummaryProvider(activity, summaryLoader); + public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider() { @Override diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceControllerTest.java index 550addb68ca..6dc2e64aa1e 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAppPreferenceControllerTest.java @@ -21,6 +21,7 @@ import android.content.Context; import android.os.UserManager; import android.support.v7.preference.Preference; +import com.android.settings.R; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; @@ -75,7 +76,7 @@ public class DefaultAppPreferenceControllerTest { mController.updateState(mPreference); - verify(mPreference).setSummary(null); + verify(mPreference).setSummary(R.string.app_list_preference_none); } private static class TestPreferenceController extends DefaultAppPreferenceController { diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceControllerTest.java index 7bcbcb09012..74612e38de2 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultAutofillPreferenceControllerTest.java @@ -23,6 +23,7 @@ import android.os.UserManager; import android.provider.Settings; import android.support.v7.preference.Preference; +import com.android.settings.R; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.applications.PackageManagerWrapper; @@ -75,7 +76,7 @@ public class DefaultAutofillPreferenceControllerTest { final Preference pref = mock(Preference.class); mController.updateState(pref); - verify(pref).setSummary(null); + verify(pref).setSummary(R.string.app_list_preference_none); } @Test diff --git a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java index 644a9426475..ee2cd1dc703 100644 --- a/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/defaultapps/DefaultBrowserPreferenceControllerTest.java @@ -23,6 +23,7 @@ import android.content.pm.ResolveInfo; import android.os.UserManager; import android.support.v7.preference.Preference; +import com.android.settings.R; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.applications.PackageManagerWrapper; @@ -92,7 +93,7 @@ public class DefaultBrowserPreferenceControllerTest { final Preference pref = mock(Preference.class); mController.updateState(pref); - verify(pref).setSummary(null); + verify(pref).setSummary(R.string.app_list_preference_none); } @Test diff --git a/tests/robotests/src/com/android/settings/deviceinfo/SystemUpdatePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/deviceinfo/SystemUpdatePreferenceControllerTest.java index b35c60a5c9d..30c6dc90ba4 100644 --- a/tests/robotests/src/com/android/settings/deviceinfo/SystemUpdatePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/deviceinfo/SystemUpdatePreferenceControllerTest.java @@ -16,21 +16,26 @@ package com.android.settings.deviceinfo; import android.content.Context; +import android.os.Build; import android.os.UserManager; import android.support.v7.preference.Preference; import android.support.v7.preference.PreferenceScreen; + import com.android.settings.R; import com.android.settings.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; -import java.util.ArrayList; -import java.util.List; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; +import java.util.ArrayList; +import java.util.List; + import static com.google.common.truth.Truth.assertThat; import static org.mockito.Answers.RETURNS_DEEP_STUBS; import static org.mockito.Matchers.any; @@ -91,6 +96,18 @@ public class SystemUpdatePreferenceControllerTest { verify(mScreen).removePreference(any(Preference.class)); } + @Test + public void updateState_shouldSetToAndroidVersion() { + final Preference preference = new Preference(RuntimeEnvironment.application); + mController = new SystemUpdatePreferenceController( + RuntimeEnvironment.application, mUserManager); + mController.updateState(preference); + + assertThat(preference.getSummary()) + .isEqualTo(RuntimeEnvironment.application.getString(R.string.about_summary, + Build.VERSION.RELEASE)); + } + @Test public void displayPrefs_oneAvailable_shouldDisplayOne() { final Preference preference = mock(Preference.class); diff --git a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java b/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java index f693fd384a8..38ffa3d519c 100644 --- a/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java +++ b/tests/robotests/src/com/android/settings/language/LanguageAndInputSettingsTest.java @@ -16,8 +16,14 @@ package com.android.settings.language; +import android.app.Activity; +import android.content.ComponentName; import android.content.Context; +import android.content.pm.PackageManager; import android.hardware.input.InputManager; +import android.provider.Settings; +import android.view.inputmethod.InputMethodInfo; +import android.view.inputmethod.InputMethodManager; import android.view.textservice.TextServicesManager; import com.android.internal.hardware.AmbientDisplayConfiguration; @@ -27,6 +33,8 @@ import com.android.settings.TestConfig; import com.android.settings.core.PreferenceController; import com.android.settings.core.lifecycle.Lifecycle; import com.android.settings.core.lifecycle.LifecycleObserver; +import com.android.settings.dashboard.SummaryLoader; +import com.android.settings.testutils.shadow.ShadowSecureSettings; import org.junit.Before; import org.junit.Test; @@ -36,6 +44,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.annotation.Config; +import java.util.ArrayList; import java.util.List; import static com.google.common.truth.Truth.assertThat; @@ -51,6 +60,10 @@ public class LanguageAndInputSettingsTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) private Context mContext; + @Mock + private PackageManager mPackageManager; + @Mock + private InputMethodManager mInputMethodManager; private TestFragment mFragment; @Before @@ -58,7 +71,7 @@ public class LanguageAndInputSettingsTest { MockitoAnnotations.initMocks(this); when(mContext.getSystemService(Context.INPUT_SERVICE)).thenReturn(mock(InputManager.class)); when(mContext.getSystemService(Context.TEXT_SERVICES_MANAGER_SERVICE)) - .thenReturn(mock(TextServicesManager.class)); + .thenReturn(mock(TextServicesManager.class)); mFragment = new TestFragment(mContext); } @@ -87,6 +100,33 @@ public class LanguageAndInputSettingsTest { assertThat(controllers.isEmpty()).isFalse(); } + @Test + @Config(shadows = { + ShadowSecureSettings.class, + }) + public void testSummary_shouldSetToCurrentImeName() { + final Activity activity = mock(Activity.class); + final SummaryLoader loader = mock(SummaryLoader.class); + final ComponentName componentName = new ComponentName("pkg", "cls"); + ShadowSecureSettings.putString(null, Settings.Secure.DEFAULT_INPUT_METHOD, + componentName.flattenToString()); + when(activity.getSystemService(Context.INPUT_METHOD_SERVICE)) + .thenReturn(mInputMethodManager); + when(activity.getPackageManager()).thenReturn(mPackageManager); + final List imis = new ArrayList<>(); + imis.add(mock(InputMethodInfo.class)); + when(imis.get(0).getPackageName()).thenReturn(componentName.getPackageName()); + when(mInputMethodManager.getInputMethodList()).thenReturn(imis); + + SummaryLoader.SummaryProvider provider = mFragment.SUMMARY_PROVIDER_FACTORY + .createSummaryProvider(activity, loader); + + provider.setListening(true); + + verify(imis.get(0)).loadLabel(mPackageManager); + verify(loader).setSummary(provider, null); + } + /** * Test fragment to expose lifecycle and context so we can verify behavior for observables. */