From cabe76debcc1666e8d90949d42206b065dea7ba8 Mon Sep 17 00:00:00 2001 From: Kevin Maurin Date: Wed, 22 Apr 2020 13:53:55 -0700 Subject: [PATCH] Display "Android Auto" in Connected Devices summary text. Android Auto will be exposing a Settings tile under Connected Devices -> Connection Preferences. If the Setting tile is available, then the summary text will reflect that. Tested with additional unit tests and manually validated the scenarios by flashing crosshatch-eng and disabling/enabling the relevant features. Fix: 153896447 Test: Added unit coverage for new scenarios Test: make RunSettingsRoboTests Test: manually verified by flashing crosshatch-eng and disabling/enabling relevant components Change-Id: I5a129c41b98ba435bc159a72c9a7c2dfd646ecd3 --- res/values/strings.xml | 8 ++ .../AdvancedConnectedDeviceController.java | 61 +++++++++--- ...AdvancedConnectedDeviceControllerTest.java | 94 +++++++++++++++++-- 3 files changed, 144 insertions(+), 19 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 6897c656dea..244e8738bbb 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -7485,6 +7485,14 @@ Bluetooth, NFC Bluetooth + + Bluetooth, Android Auto, driving mode, NFC + Bluetooth, Android Auto, driving mode + + Bluetooth, Android Auto, NFC + + Bluetooth, Android Auto Unavailable because NFC is off diff --git a/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceController.java b/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceController.java index 26c3e345558..2855f0ab16a 100644 --- a/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceController.java +++ b/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceController.java @@ -15,7 +15,10 @@ */ package com.android.settings.connecteddevice; +import static com.android.settingslib.drawer.TileUtils.IA_SETTINGS_ACTION; + import android.content.Context; +import android.content.Intent; import android.provider.Settings; import androidx.annotation.VisibleForTesting; @@ -31,6 +34,7 @@ public class AdvancedConnectedDeviceController extends BasePreferenceController private static final String DRIVING_MODE_SETTINGS_ENABLED = "gearhead:driving_mode_settings_enabled"; + private static final String GEARHEAD_PACKAGE = "com.google.android.projection.gearhead"; public AdvancedConnectedDeviceController(Context context, String preferenceKey) { super(context, preferenceKey); @@ -55,7 +59,7 @@ public class AdvancedConnectedDeviceController extends BasePreferenceController new NfcPreferenceController(context, NfcPreferenceController.KEY_TOGGLE_NFC); return getConnectedDevicesSummaryResourceId(nfcPreferenceController, - isDrivingModeAvailable(context)); + isDrivingModeAvailable(context), isAndroidAutoSettingAvailable(context)); } @VisibleForTesting @@ -64,26 +68,57 @@ public class AdvancedConnectedDeviceController extends BasePreferenceController getInt(context.getContentResolver(), DRIVING_MODE_SETTINGS_ENABLED, 0) == 1; } + @VisibleForTesting + static boolean isAndroidAutoSettingAvailable(Context context) { + final Intent intent = new Intent(IA_SETTINGS_ACTION); + intent.setPackage(GEARHEAD_PACKAGE); + return intent.resolveActivity(context.getPackageManager()) != null; + } + @VisibleForTesting static int getConnectedDevicesSummaryResourceId(NfcPreferenceController - nfcPreferenceController, boolean isDrivingModeAvailable) { + nfcPreferenceController, + boolean isDrivingModeAvailable, + boolean isAndroidAutoAvailable) { final int resId; - if (nfcPreferenceController.isAvailable()) { - if (isDrivingModeAvailable) { - // NFC available, driving mode available - resId = R.string.connected_devices_dashboard_summary; + if (isAndroidAutoAvailable) { + if (nfcPreferenceController.isAvailable()) { + if (isDrivingModeAvailable) { + // NFC available, driving mode available + resId = R.string.connected_devices_dashboard_android_auto_summary; + } else { + // NFC available, driving mode not available + resId = + R.string.connected_devices_dashboard_android_auto_no_driving_mode_summary; + } } else { - // NFC available, driving mode not available - resId = R.string.connected_devices_dashboard_no_driving_mode_summary; + if (isDrivingModeAvailable) { + // NFC not available, driving mode available + resId = R.string.connected_devices_dashboard_android_auto_no_nfc_summary; + } else { + // NFC not available, driving mode not available + resId = + R.string.connected_devices_dashboard_android_auto_no_nfc_no_driving_mode; + } } } else { - if (isDrivingModeAvailable) { - // NFC not available, driving mode available - resId = R.string.connected_devices_dashboard_no_nfc_summary; + if (nfcPreferenceController.isAvailable()) { + if (isDrivingModeAvailable) { + // NFC available, driving mode available + resId = R.string.connected_devices_dashboard_summary; + } else { + // NFC available, driving mode not available + resId = R.string.connected_devices_dashboard_no_driving_mode_summary; + } } else { - // NFC not available, driving mode not available - resId = R.string.connected_devices_dashboard_no_driving_mode_no_nfc_summary; + if (isDrivingModeAvailable) { + // NFC not available, driving mode available + resId = R.string.connected_devices_dashboard_no_nfc_summary; + } else { + // NFC not available, driving mode not available + resId = R.string.connected_devices_dashboard_no_driving_mode_no_nfc_summary; + } } } diff --git a/tests/robotests/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceControllerTest.java index 08f937b2788..974a52b519d 100644 --- a/tests/robotests/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceControllerTest.java +++ b/tests/robotests/src/com/android/settings/connecteddevice/AdvancedConnectedDeviceControllerTest.java @@ -23,9 +23,15 @@ import static org.mockito.Mockito.spy; import android.content.ContentResolver; import android.content.Context; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; +import android.content.pm.ResolveInfo; import android.nfc.NfcAdapter; import android.provider.Settings; +import androidx.test.core.content.pm.ApplicationInfoBuilder; + import com.android.settings.R; import com.android.settings.nfc.NfcPreferenceController; @@ -38,6 +44,7 @@ import org.robolectric.RuntimeEnvironment; import org.robolectric.Shadows; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowNfcAdapter; +import org.robolectric.shadows.ShadowPackageManager; import org.robolectric.util.ReflectionHelpers; @RunWith(RobolectricTestRunner.class) @@ -47,11 +54,13 @@ public class AdvancedConnectedDeviceControllerTest { private static final String KEY = "test_key"; private static final String DRIVING_MODE_SETTINGS_ENABLED = "gearhead:driving_mode_settings_enabled"; + private static final String ANDROID_AUTO_PACKAGE = "com.google.android.projection.gearhead"; private Context mContext; private NfcPreferenceController mNfcController; private ShadowNfcAdapter mShadowNfcAdapter; private ContentResolver mContentResolver; + private ShadowPackageManager mShadowPackageManager; @Before public void setUp() { @@ -62,6 +71,7 @@ public class AdvancedConnectedDeviceControllerTest { mNfcController = new NfcPreferenceController(mContext, NfcPreferenceController.KEY_TOGGLE_NFC); mShadowNfcAdapter = Shadows.shadowOf(NfcAdapter.getNfcAdapter(mContext)); + mShadowPackageManager = Shadows.shadowOf(mContext.getPackageManager()); } @Test @@ -76,14 +86,41 @@ public class AdvancedConnectedDeviceControllerTest { public void isDrivingModeAvailable_returnTrue() { Settings.System.putInt(mContentResolver, DRIVING_MODE_SETTINGS_ENABLED, 1); - assertThat(AdvancedConnectedDeviceController.isDrivingModeAvailable(mContext)).isTrue(); + assertThat( + AdvancedConnectedDeviceController.isDrivingModeAvailable(mContext)).isTrue(); } @Test public void isDrivingModeAvailable_returnFalse() { Settings.System.putInt(mContentResolver, DRIVING_MODE_SETTINGS_ENABLED, 0); - assertThat(AdvancedConnectedDeviceController.isDrivingModeAvailable(mContext)).isFalse(); + assertThat( + AdvancedConnectedDeviceController.isDrivingModeAvailable(mContext)).isFalse(); + } + + @Test + public void isAndroidAutoSettingAvailable_returnTrue() { + final ApplicationInfo appInfo = + ApplicationInfoBuilder.newBuilder().setPackageName(ANDROID_AUTO_PACKAGE).build(); + final ActivityInfo activityInfo = new ActivityInfo(); + activityInfo.packageName = ANDROID_AUTO_PACKAGE; + activityInfo.name = ANDROID_AUTO_PACKAGE; + activityInfo.applicationInfo = appInfo; + final ResolveInfo resolveInfo = new ResolveInfo(); + resolveInfo.activityInfo = activityInfo; + mShadowPackageManager.addResolveInfoForIntent( + buildAndroidAutoSettingsIntent(), + resolveInfo); + + assertThat( + AdvancedConnectedDeviceController.isAndroidAutoSettingAvailable(mContext)).isTrue(); + } + + @Test + public void isAndroidAutoSettingAvailable_returnFalse() { + // No ResolveInfo for Android Auto, expect false. + assertThat( + AdvancedConnectedDeviceController.isAndroidAutoSettingAvailable(mContext)).isFalse(); } @Test @@ -91,7 +128,7 @@ public class AdvancedConnectedDeviceControllerTest { // NFC available, driving mode available mShadowNfcAdapter.setEnabled(true); assertThat(AdvancedConnectedDeviceController - .getConnectedDevicesSummaryResourceId(mNfcController, true)) + .getConnectedDevicesSummaryResourceId(mNfcController, true, false)) .isEqualTo(R.string.connected_devices_dashboard_summary); } @@ -100,7 +137,7 @@ public class AdvancedConnectedDeviceControllerTest { // NFC is available, driving mode not available mShadowNfcAdapter.setEnabled(true); assertThat(AdvancedConnectedDeviceController - .getConnectedDevicesSummaryResourceId(mNfcController, false)) + .getConnectedDevicesSummaryResourceId(mNfcController, false, false)) .isEqualTo(R.string.connected_devices_dashboard_no_driving_mode_summary); } @@ -109,7 +146,7 @@ public class AdvancedConnectedDeviceControllerTest { // NFC not available, driving mode available ReflectionHelpers.setField(mNfcController, "mNfcAdapter", null); assertThat(AdvancedConnectedDeviceController - .getConnectedDevicesSummaryResourceId(mNfcController, true)) + .getConnectedDevicesSummaryResourceId(mNfcController, true, false)) .isEqualTo(R.string.connected_devices_dashboard_no_nfc_summary); } @@ -118,7 +155,52 @@ public class AdvancedConnectedDeviceControllerTest { // NFC not available, driving mode not available ReflectionHelpers.setField(mNfcController, "mNfcAdapter", null); assertThat(AdvancedConnectedDeviceController - .getConnectedDevicesSummaryResourceId(mNfcController, false)) + .getConnectedDevicesSummaryResourceId(mNfcController, false, false)) .isEqualTo(R.string.connected_devices_dashboard_no_driving_mode_no_nfc_summary); } + + @Test + public void getConnectedDevicesSummaryResourceId_Auto_NFC_DrivingMode_Available() { + // NFC available, driving mode available + mShadowNfcAdapter.setEnabled(true); + assertThat(AdvancedConnectedDeviceController + .getConnectedDevicesSummaryResourceId(mNfcController, true, true)) + .isEqualTo(R.string.connected_devices_dashboard_android_auto_summary); + } + + @Test + public void getConnectedDevicesSummaryResourceId_Auto_NFC_Available() { + // NFC is available, driving mode not available + mShadowNfcAdapter.setEnabled(true); + assertThat(AdvancedConnectedDeviceController + .getConnectedDevicesSummaryResourceId(mNfcController, false, true)) + .isEqualTo( + R.string.connected_devices_dashboard_android_auto_no_driving_mode_summary); + } + + @Test + public void getConnectedDevicesSummaryResourceId_Auto_DrivingMode_Available() { + // NFC not available, driving mode available + ReflectionHelpers.setField(mNfcController, "mNfcAdapter", null); + assertThat(AdvancedConnectedDeviceController + .getConnectedDevicesSummaryResourceId(mNfcController, true, true)) + .isEqualTo(R.string.connected_devices_dashboard_android_auto_no_nfc_summary); + } + + @Test + public void getConnectedDevicesSummaryResourceId_Auto_Available() { + // NFC not available, driving mode not available + ReflectionHelpers.setField(mNfcController, "mNfcAdapter", null); + assertThat(AdvancedConnectedDeviceController + .getConnectedDevicesSummaryResourceId(mNfcController, false, true)) + .isEqualTo( + R.string.connected_devices_dashboard_android_auto_no_nfc_no_driving_mode); + } + + private Intent buildAndroidAutoSettingsIntent() { + final Intent intent = new Intent("com.android.settings.action.IA_SETTINGS"); + intent.setPackage(ANDROID_AUTO_PACKAGE); + return intent; + } } +