diff --git a/res/xml/app_info_settings.xml b/res/xml/app_info_settings.xml
index 48a4b6a5c78..e2fb2e44d30 100644
--- a/res/xml/app_info_settings.xml
+++ b/res/xml/app_info_settings.xml
@@ -39,21 +39,18 @@
+ android:title="@string/notifications_label"/>
+ android:summary="@string/summary_placeholder"/>
+ android:summary="@string/summary_placeholder"/>
+ android:summary="@string/summary_placeholder"/>
+ android:enabled="false"/>
+
+
+
+
+
+
+
+
+
+
+
intent != null
+ && intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT).equals(
+ DefaultAppSettings.class.getName())
+ && intent.getBundleExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT_ARGUMENTS)
+ .getString(SettingsActivity.EXTRA_FRAGMENT_ARG_KEY).equals("TestKey")));
+ }
+
+ private class TestPreferenceController extends DefaultAppShortcutPreferenceControllerBase {
+
+ private boolean isDefault;
+ private boolean capable;
+
+ public TestPreferenceController(Context context, AppInfoDashboardFragment parent) {
+ super(context, "TestKey", "TestPackage");
+ }
+
+ @Override
+ protected boolean hasAppCapability() {
+ return capable;
+ }
+
+ @Override
+ protected boolean isDefaultApp() {
+ return isDefault;
+ }
+
+ }
+
+}
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultBrowserShortcutPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultBrowserShortcutPreferenceControllerTest.java
new file mode 100644
index 00000000000..0a18722b14e
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultBrowserShortcutPreferenceControllerTest.java
@@ -0,0 +1,96 @@
+/*
+ * 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.settings.applications.appinfo;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+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;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION_O)
+public class DefaultBrowserShortcutPreferenceControllerTest {
+
+ @Mock
+ private PackageManager mPackageManager;
+
+ private Context mContext;
+ private DefaultBrowserShortcutPreferenceController mController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(RuntimeEnvironment.application);
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
+ mController = new DefaultBrowserShortcutPreferenceController(mContext, "Package1");
+ }
+
+ @Test
+ public void getPreferenceKey_shouldReturnDefaultBrowser() {
+ assertThat(mController.getPreferenceKey()).isEqualTo("default_browser");
+ }
+
+ @Test
+ public void hasAppCapability_hasBrowserCapability_shouldReturnTrue() {
+ List resolveInfos = new ArrayList<>();
+ resolveInfos.add(new ResolveInfo());
+ when(mPackageManager.queryIntentActivities(argThat(intent-> intent != null
+ && intent.getCategories().contains(Intent.CATEGORY_BROWSABLE)), anyInt()))
+ .thenReturn(resolveInfos);
+
+ assertThat(mController.hasAppCapability()).isTrue();
+ }
+
+ @Test
+ public void hasAppCapability_noBrowserCapability_shouldReturnFalse() {
+ assertThat(mController.hasAppCapability()).isFalse();
+ }
+
+ @Test
+ public void isDefaultApp_isDefaultBrowser_shouldReturnTrue() {
+ when(mPackageManager.getDefaultBrowserPackageNameAsUser(anyInt())).thenReturn("Package1");
+
+ assertThat(mController.isDefaultApp()).isTrue();
+ }
+
+ @Test
+ public void isDefaultApp_notDefaultBrowser_shouldReturnFalse() {
+ assertThat(mController.isDefaultApp()).isFalse();
+ }
+
+}
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultEmergencyShortcutPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultEmergencyShortcutPreferenceControllerTest.java
new file mode 100644
index 00000000000..414ef705554
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultEmergencyShortcutPreferenceControllerTest.java
@@ -0,0 +1,99 @@
+/*
+ * 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.settings.applications.appinfo;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.provider.Settings;
+import android.telephony.TelephonyManager;
+
+import com.android.settings.TestConfig;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+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;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION_O)
+public class DefaultEmergencyShortcutPreferenceControllerTest {
+
+ @Mock
+ private PackageManager mPackageManager;
+
+ private Context mContext;
+ private DefaultEmergencyShortcutPreferenceController mController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(RuntimeEnvironment.application);
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
+ mController = new DefaultEmergencyShortcutPreferenceController(mContext, "Package1");
+ }
+
+ @Test
+ public void getPreferenceKey_shouldReturnDefaultEmergency() {
+ assertThat(mController.getPreferenceKey()).isEqualTo("default_emergency_app");
+ }
+
+ @Test
+ public void hasAppCapability_hasEmergencyCapability_shouldReturnTrue() {
+ List resolveInfos = new ArrayList<>();
+ resolveInfos.add(new ResolveInfo());
+ when(mPackageManager.queryIntentActivities(argThat(intent-> intent != null
+ && intent.getAction().equals(TelephonyManager.ACTION_EMERGENCY_ASSISTANCE)),
+ anyInt())).thenReturn(resolveInfos);
+
+ assertThat(mController.hasAppCapability()).isTrue();
+ }
+
+ @Test
+ public void hasAppCapability_noEmergencyCapability_shouldReturnFalse() {
+ assertThat(mController.hasAppCapability()).isFalse();
+ }
+
+ @Test
+ public void isDefaultApp_isDefaultEmergency_shouldReturnTrue() {
+ Settings.Secure.putString(mContext.getContentResolver(),
+ Settings.Secure.EMERGENCY_ASSISTANCE_APPLICATION, "Package1");
+
+ assertThat(mController.isDefaultApp()).isTrue();
+ }
+
+ @Test
+ public void isDefaultApp_notDefaultEmergency_shouldReturnFalse() {
+ assertThat(mController.isDefaultApp()).isFalse();
+ }
+
+}
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultHomeShortcutPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultHomeShortcutPreferenceControllerTest.java
new file mode 100644
index 00000000000..a0a57f688f7
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultHomeShortcutPreferenceControllerTest.java
@@ -0,0 +1,99 @@
+/*
+ * 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.settings.applications.appinfo;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+import com.android.settings.TestConfig;
+import com.android.settings.applications.defaultapps.DefaultHomePreferenceController;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+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 org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION_O)
+public class DefaultHomeShortcutPreferenceControllerTest {
+
+ @Mock
+ private PackageManager mPackageManager;
+
+ private Context mContext;
+ private DefaultHomeShortcutPreferenceController mController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(RuntimeEnvironment.application);
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
+ mController = new DefaultHomeShortcutPreferenceController(mContext, "Package1");
+ }
+
+ @Test
+ public void getPreferenceKey_shouldReturnDefaultHome() {
+ assertThat(mController.getPreferenceKey()).isEqualTo("default_home");
+ }
+
+ @Test
+ @Config(shadows = ShadowDefaultHomePreferenceController.class)
+ public void hasAppCapability_hasHomeCapability_shouldReturnTrue() {
+ assertThat(mController.hasAppCapability()).isTrue();
+ }
+
+ @Test
+ public void hasAppCapability_noHomeCapability_shouldReturnFalse() {
+ assertThat(mController.hasAppCapability()).isFalse();
+ }
+
+ @Test
+ public void isDefaultApp_isDefaultHome_shouldReturnTrue() {
+ when(mPackageManager.getHomeActivities(anyList()))
+ .thenReturn(new ComponentName("Package1", "cls1"));
+ assertThat(mController.isDefaultApp()).isTrue();
+ }
+
+ @Test
+ public void isDefaultApp_notDefaultHome_shouldReturnFalse() {
+ when(mPackageManager.getHomeActivities(anyList()))
+ .thenReturn(new ComponentName("pkg2", "cls1"));
+ assertThat(mController.isDefaultApp()).isFalse();
+ }
+
+ @Implements(DefaultHomePreferenceController.class)
+ public static class ShadowDefaultHomePreferenceController {
+ @Implementation
+ public static boolean hasHomePreference(String pkg, Context context) {
+ return true;
+ }
+ }
+
+}
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultPhoneShortcutPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultPhoneShortcutPreferenceControllerTest.java
new file mode 100644
index 00000000000..d04b114afb3
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultPhoneShortcutPreferenceControllerTest.java
@@ -0,0 +1,99 @@
+/*
+ * 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.settings.applications.appinfo;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+import com.android.settings.TestConfig;
+import com.android.settings.applications.defaultapps.DefaultPhonePreferenceController;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+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 org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION_O)
+public class DefaultPhoneShortcutPreferenceControllerTest {
+
+ @Mock
+ private PackageManager mPackageManager;
+
+ private Context mContext;
+ private DefaultPhoneShortcutPreferenceController mController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(RuntimeEnvironment.application);
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
+ mController = new DefaultPhoneShortcutPreferenceController(mContext, "Package1");
+ }
+
+ @Test
+ public void getPreferenceKey_shouldReturnDefaultPhone() {
+ assertThat(mController.getPreferenceKey()).isEqualTo("default_phone_app");
+ }
+
+ @Test
+ @Config(shadows = ShadowDefaultPhonePreferenceController.class)
+ public void hasAppCapability_hasPhoneCapability_shouldReturnTrue() {
+ assertThat(mController.hasAppCapability()).isTrue();
+ }
+
+ @Test
+ public void hasAppCapability_noPhoneCapability_shouldReturnFalse() {
+ assertThat(mController.hasAppCapability()).isFalse();
+ }
+
+ @Test
+ @Config(shadows = ShadowDefaultPhonePreferenceController.class)
+ public void isDefaultApp_isDefaultPhone_shouldReturnTrue() {
+ assertThat(mController.isDefaultApp()).isTrue();
+ }
+
+ @Test
+ public void isDefaultApp_notDefaultPhone_shouldReturnFalse() {
+ assertThat(mController.isDefaultApp()).isFalse();
+ }
+
+ @Implements(DefaultPhonePreferenceController.class)
+ public static class ShadowDefaultPhonePreferenceController {
+ @Implementation
+ public static boolean hasPhonePreference(String pkg, Context context) {
+ return true;
+ }
+
+ @Implementation
+ public static boolean isPhoneDefault(String pkg, Context context) {
+ return true;
+ }
+ }
+
+}
diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/DefaultSmsShortcutPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultSmsShortcutPreferenceControllerTest.java
new file mode 100644
index 00000000000..4abaa6a9bbc
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/applications/appinfo/DefaultSmsShortcutPreferenceControllerTest.java
@@ -0,0 +1,99 @@
+/*
+ * 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.settings.applications.appinfo;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+
+import com.android.settings.TestConfig;
+import com.android.settings.applications.defaultapps.DefaultSmsPreferenceController;
+import com.android.settings.testutils.SettingsRobolectricTestRunner;
+
+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 org.robolectric.annotation.Implementation;
+import org.robolectric.annotation.Implements;
+
+@RunWith(SettingsRobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION_O)
+public class DefaultSmsShortcutPreferenceControllerTest {
+
+ @Mock
+ private PackageManager mPackageManager;
+
+ private Context mContext;
+ private DefaultSmsShortcutPreferenceController mController;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(RuntimeEnvironment.application);
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
+ mController = new DefaultSmsShortcutPreferenceController(mContext, "Package1");
+ }
+
+ @Test
+ public void getPreferenceKey_shouldReturnDefaultSms() {
+ assertThat(mController.getPreferenceKey()).isEqualTo("default_sms_app");
+ }
+
+ @Test
+ @Config(shadows = ShadowDefaultSmsPreferenceController.class)
+ public void hasAppCapability_hasSmsCapability_shouldReturnTrue() {
+ assertThat(mController.hasAppCapability()).isTrue();
+ }
+
+ @Test
+ public void hasAppCapability_noSmsCapability_shouldReturnFalse() {
+ assertThat(mController.hasAppCapability()).isFalse();
+ }
+
+ @Test
+ @Config(shadows = ShadowDefaultSmsPreferenceController.class)
+ public void isDefaultApp_isDefaultSms_shouldReturnTrue() {
+ assertThat(mController.isDefaultApp()).isTrue();
+ }
+
+ @Test
+ public void isDefaultApp_notDefaultSms_shouldReturnFalse() {
+ assertThat(mController.isDefaultApp()).isFalse();
+ }
+
+ @Implements(DefaultSmsPreferenceController.class)
+ public static class ShadowDefaultSmsPreferenceController {
+ @Implementation
+ public static boolean hasSmsPreference(String pkg, Context context) {
+ return true;
+ }
+
+ @Implementation
+ public static boolean isSmsDefault(String pkg, Context context) {
+ return true;
+ }
+ }
+
+}