Merge "Dump the default broswer in SettingsDumpService"
diff --git a/src/com/android/settings/SettingsDumpService.java b/src/com/android/settings/SettingsDumpService.java
index 472a2eb..67a8f50 100644
--- a/src/com/android/settings/SettingsDumpService.java
+++ b/src/com/android/settings/SettingsDumpService.java
@@ -16,14 +16,18 @@
 
 import android.app.Service;
 import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
 import android.net.ConnectivityManager;
 import android.net.NetworkTemplate;
+import android.net.Uri;
 import android.os.IBinder;
 import android.os.storage.StorageManager;
 import android.os.storage.VolumeInfo;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.settings.applications.ProcStatsData;
 import com.android.settingslib.net.DataUsageController;
 import org.json.JSONArray;
@@ -35,6 +39,13 @@
 import java.io.PrintWriter;
 
 public class SettingsDumpService extends Service {
+    @VisibleForTesting static final String KEY_SERVICE = "service";
+    @VisibleForTesting static final String KEY_STORAGE = "storage";
+    @VisibleForTesting static final String KEY_DATAUSAGE = "datausage";
+    @VisibleForTesting static final String KEY_MEMORY = "memory";
+    @VisibleForTesting static final String KEY_DEFAULT_BROWSER_APP = "default_browser_app";
+    @VisibleForTesting static final Intent BROWSER_INTENT =
+            new Intent("android.intent.action.VIEW", Uri.parse("http://"));
 
     @Override
     public IBinder onBind(Intent intent) {
@@ -46,10 +57,11 @@
         JSONObject dump = new JSONObject();
 
         try {
-            dump.put("service", "Settings State");
-            dump.put("storage", dumpStorage());
-            dump.put("datausage", dumpDataUsage());
-            dump.put("memory", dumpMemory());
+            dump.put(KEY_SERVICE, "Settings State");
+            dump.put(KEY_STORAGE, dumpStorage());
+            dump.put(KEY_DATAUSAGE, dumpDataUsage());
+            dump.put(KEY_MEMORY, dumpMemory());
+            dump.put(KEY_DEFAULT_BROWSER_APP, dumpDefaultBrowser());
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -127,4 +139,16 @@
         }
         return obj;
     }
+
+    @VisibleForTesting
+    String dumpDefaultBrowser() {
+        final ResolveInfo resolveInfo = getPackageManager().resolveActivity(
+                BROWSER_INTENT, PackageManager.MATCH_DEFAULT_ONLY);
+
+        if (resolveInfo == null || resolveInfo.activityInfo.packageName.equals("android")) {
+            return null;
+        } else {
+            return resolveInfo.activityInfo.packageName;
+        }
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/SettingsDumpServiceTest.java b/tests/robotests/src/com/android/settings/SettingsDumpServiceTest.java
new file mode 100644
index 0000000..043b0fe
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/SettingsDumpServiceTest.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2016 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.settings;
+
+import android.content.pm.ActivityInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.support.annotation.NonNull;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.annotation.Config;
+
+import java.io.OutputStream;
+import java.io.PrintWriter;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Mockito.when;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class SettingsDumpServiceTest {
+    private static final String PACKAGE_BROWSER = "com.android.test.browser";
+    private static final String PACKAGE_NULL = "android";
+    @Mock
+    private PackageManager mPackageManager;
+    @Mock
+    private ResolveInfo mResolveInfo;
+    private TestService mTestService;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        when(mPackageManager.resolveActivity(TestService.BROWSER_INTENT,
+                PackageManager.MATCH_DEFAULT_ONLY)).thenReturn(mResolveInfo);
+        mTestService = new TestService();
+        mTestService.setPackageManager(mPackageManager);
+    }
+
+    @Test
+    public void testDumpDefaultBrowser_DefaultBrowser_ReturnBrowserName() {
+        mResolveInfo.activityInfo = new ActivityInfo();
+        mResolveInfo.activityInfo.packageName = PACKAGE_BROWSER;
+
+        assertThat(mTestService.dumpDefaultBrowser()).isEqualTo(PACKAGE_BROWSER);
+    }
+
+    @Test
+    public void testDumpDefaultBrowser_NoDefault_ReturnNull() {
+        mResolveInfo.activityInfo = new ActivityInfo();
+        mResolveInfo.activityInfo.packageName = PACKAGE_NULL;
+
+        assertThat(mTestService.dumpDefaultBrowser()).isEqualTo(null);
+    }
+
+    @Test
+    public void testDump_ReturnJsonObject() throws JSONException {
+        mResolveInfo.activityInfo = new ActivityInfo();
+        mResolveInfo.activityInfo.packageName = PACKAGE_BROWSER;
+        TestPrintWriter printWriter = new TestPrintWriter(System.out);
+
+        mTestService.dump(null, printWriter, null);
+        JSONObject object = (JSONObject)printWriter.getPrintObject();
+
+        assertThat(object.get(TestService.KEY_SERVICE)).isNotNull();
+    }
+
+    /**
+     * Test service used to pass in the mock {@link PackageManager}
+     */
+    private class TestService extends SettingsDumpService {
+        private PackageManager mPm;
+
+        public void setPackageManager(PackageManager pm) {
+            mPm = pm;
+        }
+
+        @Override
+        public PackageManager getPackageManager() {
+            return mPm;
+        }
+    }
+
+    /**
+     * Test printWriter to store the object to be printed
+     */
+    private class TestPrintWriter extends PrintWriter {
+        private Object mPrintObject;
+
+        public TestPrintWriter(@NonNull OutputStream out) {
+            super(out);
+        }
+
+        @Override
+        public void println(Object object) {
+            mPrintObject = object;
+        }
+
+        public Object getPrintObject() {
+            return mPrintObject;
+        }
+    }
+}