WebView implementation Dev setting: Show the version number after name

Show the package version of each WebView implementation after their
package name in the WebView Implementation Dev Setting. Showing a
package version is useful for debugging purposes.

Bug: 35621558
Test: run make RunSettingsRoboTests
Test: Ensure package version is shown in titles of items in WebView
Implementation Dev Setting.
Change-Id: If195dd87aebeac1783600b7c9f376ff8e791c3be
diff --git a/src/com/android/settings/webview/WebViewAppPicker.java b/src/com/android/settings/webview/WebViewAppPicker.java
index 586ee36..f1faf9b 100644
--- a/src/com/android/settings/webview/WebViewAppPicker.java
+++ b/src/com/android/settings/webview/WebViewAppPicker.java
@@ -21,7 +21,9 @@
 import android.app.Activity;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageItemInfo;
 import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
 import android.content.Context;
 import android.support.annotation.VisibleForTesting;
 import android.text.TextUtils;
@@ -60,8 +62,8 @@
                 getWebViewUpdateServiceWrapper().getValidWebViewApplicationInfos(getContext());
         for (ApplicationInfo ai : pkgs) {
             packageInfoList.add(createDefaultAppInfo(ai,
-                      getDisabledReason(getWebViewUpdateServiceWrapper(),
-                              getContext(), ai.packageName)));
+                    getDisabledReason(getWebViewUpdateServiceWrapper(),
+                            getContext(), ai.packageName)));
         }
         return packageInfoList;
     }
@@ -107,10 +109,26 @@
         return MetricsEvent.WEBVIEW_IMPLEMENTATION;
     }
 
+    private static class WebViewAppInfo extends DefaultAppInfo {
+        public WebViewAppInfo(PackageItemInfo packageItemInfo, String summary, boolean enabled) {
+          super(packageItemInfo, summary, enabled);
+        }
+
+        @Override
+        public CharSequence loadLabel(PackageManager pm) {
+            String versionName = "";
+            try {
+                versionName = pm.getPackageInfo(packageItemInfo.packageName, 0).versionName;
+            } catch (PackageManager.NameNotFoundException e) {
+            }
+            return String.format("%s %s", super.loadLabel(pm), versionName);
+        }
+    }
+
+
     @VisibleForTesting
-    DefaultAppInfo createDefaultAppInfo(
-            ApplicationInfo applicationInfo, String disabledReason) {
-        return new DefaultAppInfo(applicationInfo, disabledReason,
+    DefaultAppInfo createDefaultAppInfo(PackageItemInfo packageItemInfo, String disabledReason) {
+        return new WebViewAppInfo(packageItemInfo, disabledReason,
                 TextUtils.isEmpty(disabledReason) /* enabled */);
     }
 
diff --git a/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java b/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java
index c58ce37..728e357 100644
--- a/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java
+++ b/tests/robotests/src/com/android/settings/webview/WebViewAppPickerTest.java
@@ -19,6 +19,7 @@
 import static android.provider.Settings.ACTION_WEBVIEW_SETTINGS;
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.doReturn;
@@ -33,9 +34,11 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageItemInfo;
+import android.content.pm.PackageManager;
 import android.content.pm.UserInfo;
 import android.os.UserManager;
-import android.support.v7.preference.PreferenceManager;
 
 import com.android.settings.SettingsRobolectricTestRunner;
 import com.android.settings.TestConfig;
@@ -325,4 +328,30 @@
         assertThat(mPicker.getDisabledReason(wvusWrapper, mContext,
                 DEFAULT_PACKAGE_NAME)).isEqualTo(EXPECTED_DISABLED_REASON);
     }
+
+    /**
+     * Ensure that the version name of a WebView package is displayed after its name in the
+     * preference title.
+     */
+    @Test
+    public void testWebViewVersionAddedAfterLabel() throws PackageManager.NameNotFoundException {
+        PackageItemInfo mockPackageItemInfo = mock(PackageItemInfo.class);
+        mockPackageItemInfo.packageName = DEFAULT_PACKAGE_NAME;
+        when(mockPackageItemInfo.loadLabel(any())).thenReturn("myPackage");
+        DefaultAppInfo webviewAppInfo = mPicker.createDefaultAppInfo(
+                mockPackageItemInfo, "" /* disabledReason */);
+
+        PackageInfo packageInfo = new PackageInfo();
+        packageInfo.versionName = "myVersionName";
+        PackageManager pm = mock(PackageManager.class);
+        when(pm.getPackageInfo(eq(DEFAULT_PACKAGE_NAME), anyInt())).thenReturn(packageInfo);
+        when(mPackageManager.getPackageManager()).thenReturn(pm);
+
+        RadioButtonPreference mockPreference = mock(RadioButtonPreference.class);
+        mPicker.configurePreferenceFromAppInfo(mockPreference,
+                DEFAULT_PACKAGE_NAME, webviewAppInfo, null, null);
+
+        verify(mockPreference, times(1)).setTitle(eq("myPackage myVersionName"));
+        verify(mockPreference, times(1)).setTitle(any());
+    }
 }