• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License
15  */
16 package com.android.settings.connecteddevice;
17 
18 import static com.android.settings.core.BasePreferenceController.AVAILABLE;
19 
20 import static com.google.common.truth.Truth.assertThat;
21 
22 import static org.mockito.Mockito.spy;
23 
24 import android.content.ContentResolver;
25 import android.content.Context;
26 import android.content.Intent;
27 import android.content.pm.ActivityInfo;
28 import android.content.pm.ApplicationInfo;
29 import android.content.pm.ResolveInfo;
30 import android.nfc.NfcAdapter;
31 import android.provider.Settings;
32 
33 import androidx.test.core.content.pm.ApplicationInfoBuilder;
34 
35 import com.android.settings.R;
36 import com.android.settings.nfc.NfcPreferenceController;
37 import com.android.settings.testutils.shadow.ShadowNfcAdapter;
38 
39 import org.junit.Before;
40 import org.junit.Test;
41 import org.junit.runner.RunWith;
42 import org.mockito.MockitoAnnotations;
43 import org.robolectric.RobolectricTestRunner;
44 import org.robolectric.RuntimeEnvironment;
45 import org.robolectric.Shadows;
46 import org.robolectric.annotation.Config;
47 import org.robolectric.shadow.api.Shadow;
48 import org.robolectric.shadows.ShadowPackageManager;
49 import org.robolectric.util.ReflectionHelpers;
50 
51 @RunWith(RobolectricTestRunner.class)
52 @Config(shadows = ShadowNfcAdapter.class)
53 public class AdvancedConnectedDeviceControllerTest {
54 
55     private static final String KEY = "test_key";
56     private static final String DRIVING_MODE_SETTINGS_ENABLED =
57             "gearhead:driving_mode_settings_enabled";
58     private static final String ANDROID_AUTO_PACKAGE = "com.google.android.projection.gearhead";
59 
60     private Context mContext;
61     private NfcPreferenceController mNfcController;
62     private ShadowNfcAdapter mShadowNfcAdapter;
63     private ContentResolver mContentResolver;
64     private ShadowPackageManager mShadowPackageManager;
65 
66     @Before
setUp()67     public void setUp() {
68         MockitoAnnotations.initMocks(this);
69 
70         mContext = spy(RuntimeEnvironment.application);
71         mContentResolver = mContext.getContentResolver();
72         mNfcController = new NfcPreferenceController(mContext,
73                 NfcPreferenceController.KEY_TOGGLE_NFC);
74         mShadowNfcAdapter = Shadow.extract(NfcAdapter.getDefaultAdapter(mContext));
75         mShadowPackageManager = Shadows.shadowOf(mContext.getPackageManager());
76     }
77 
78     @Test
getAvailabilityStatus_returnStatusIsAvailable()79     public void getAvailabilityStatus_returnStatusIsAvailable() {
80         AdvancedConnectedDeviceController controller =
81                 new AdvancedConnectedDeviceController(mContext, KEY);
82 
83         assertThat(controller.getAvailabilityStatus()).isEqualTo(AVAILABLE);
84     }
85 
86     @Test
isDrivingModeAvailable_returnTrue()87     public void isDrivingModeAvailable_returnTrue() {
88         Settings.System.putInt(mContentResolver, DRIVING_MODE_SETTINGS_ENABLED, 1);
89 
90         assertThat(
91             AdvancedConnectedDeviceController.isDrivingModeAvailable(mContext)).isTrue();
92     }
93 
94     @Test
isDrivingModeAvailable_returnFalse()95     public void isDrivingModeAvailable_returnFalse() {
96         Settings.System.putInt(mContentResolver, DRIVING_MODE_SETTINGS_ENABLED, 0);
97 
98         assertThat(
99             AdvancedConnectedDeviceController.isDrivingModeAvailable(mContext)).isFalse();
100     }
101 
102     @Test
isAndroidAutoSettingAvailable_returnTrue()103     public void isAndroidAutoSettingAvailable_returnTrue() {
104         final ApplicationInfo appInfo =
105                 ApplicationInfoBuilder.newBuilder().setPackageName(ANDROID_AUTO_PACKAGE).build();
106         final ActivityInfo activityInfo = new ActivityInfo();
107         activityInfo.packageName = ANDROID_AUTO_PACKAGE;
108         activityInfo.name = ANDROID_AUTO_PACKAGE;
109         activityInfo.applicationInfo = appInfo;
110         final ResolveInfo resolveInfo = new ResolveInfo();
111         resolveInfo.activityInfo = activityInfo;
112         mShadowPackageManager.addResolveInfoForIntent(
113                 buildAndroidAutoSettingsIntent(),
114                 resolveInfo);
115 
116         assertThat(
117             AdvancedConnectedDeviceController.isAndroidAutoSettingAvailable(mContext)).isTrue();
118     }
119 
120     @Test
isAndroidAutoSettingAvailable_returnFalse()121     public void isAndroidAutoSettingAvailable_returnFalse() {
122         // No ResolveInfo for Android Auto, expect false.
123         assertThat(
124             AdvancedConnectedDeviceController.isAndroidAutoSettingAvailable(mContext)).isFalse();
125     }
126 
127     @Test
getConnectedDevicesSummaryResourceId_NFCAndDrivingModeAvailable()128     public void getConnectedDevicesSummaryResourceId_NFCAndDrivingModeAvailable() {
129         // NFC available, driving mode available
130         mShadowNfcAdapter.setEnabled(true);
131         assertThat(AdvancedConnectedDeviceController
132                 .getConnectedDevicesSummaryResourceId(mNfcController, true, false))
133                 .isEqualTo(R.string.connected_devices_dashboard_summary);
134     }
135 
136     @Test
getConnectedDevicesSummaryResourceId_NFCAvailableAndDrivingModeNotAvailable()137     public void getConnectedDevicesSummaryResourceId_NFCAvailableAndDrivingModeNotAvailable() {
138         // NFC is available, driving mode not available
139         mShadowNfcAdapter.setEnabled(true);
140         assertThat(AdvancedConnectedDeviceController
141                 .getConnectedDevicesSummaryResourceId(mNfcController, false, false))
142                 .isEqualTo(R.string.connected_devices_dashboard_no_driving_mode_summary);
143     }
144 
145     @Test
getConnectedDevicesSummaryResourceId_NFCNotAvailableDrivingModeAvailable()146     public void getConnectedDevicesSummaryResourceId_NFCNotAvailableDrivingModeAvailable() {
147         // NFC not available, driving mode available
148         ReflectionHelpers.setField(mNfcController, "mNfcAdapter", null);
149         assertThat(AdvancedConnectedDeviceController
150                 .getConnectedDevicesSummaryResourceId(mNfcController, true, false))
151                 .isEqualTo(R.string.connected_devices_dashboard_no_nfc_summary);
152     }
153 
154     @Test
getConnectedDevicesSummaryResourceId_NFCAndDrivingModeNotAvailable()155     public void getConnectedDevicesSummaryResourceId_NFCAndDrivingModeNotAvailable() {
156         // NFC not available, driving mode not available
157         ReflectionHelpers.setField(mNfcController, "mNfcAdapter", null);
158         assertThat(AdvancedConnectedDeviceController
159                 .getConnectedDevicesSummaryResourceId(mNfcController, false, false))
160                 .isEqualTo(R.string.connected_devices_dashboard_no_driving_mode_no_nfc_summary);
161     }
162 
163     @Test
getConnectedDevicesSummaryResourceId_Auto_NFC_DrivingMode_Available()164     public void getConnectedDevicesSummaryResourceId_Auto_NFC_DrivingMode_Available() {
165         // NFC available, driving mode available
166         mShadowNfcAdapter.setEnabled(true);
167         assertThat(AdvancedConnectedDeviceController
168                 .getConnectedDevicesSummaryResourceId(mNfcController, true, true))
169                 .isEqualTo(R.string.connected_devices_dashboard_android_auto_summary);
170     }
171 
172     @Test
getConnectedDevicesSummaryResourceId_Auto_NFC_Available()173     public void getConnectedDevicesSummaryResourceId_Auto_NFC_Available() {
174         // NFC is available, driving mode not available
175         mShadowNfcAdapter.setEnabled(true);
176         assertThat(AdvancedConnectedDeviceController
177                 .getConnectedDevicesSummaryResourceId(mNfcController, false, true))
178                 .isEqualTo(
179                     R.string.connected_devices_dashboard_android_auto_no_driving_mode_summary);
180     }
181 
182     @Test
getConnectedDevicesSummaryResourceId_Auto_DrivingMode_Available()183     public void getConnectedDevicesSummaryResourceId_Auto_DrivingMode_Available() {
184         // NFC not available, driving mode available
185         ReflectionHelpers.setField(mNfcController, "mNfcAdapter", null);
186         assertThat(AdvancedConnectedDeviceController
187                 .getConnectedDevicesSummaryResourceId(mNfcController, true, true))
188                 .isEqualTo(R.string.connected_devices_dashboard_android_auto_no_nfc_summary);
189     }
190 
191     @Test
getConnectedDevicesSummaryResourceId_Auto_Available()192     public void getConnectedDevicesSummaryResourceId_Auto_Available() {
193         // NFC not available, driving mode not available
194         ReflectionHelpers.setField(mNfcController, "mNfcAdapter", null);
195         assertThat(AdvancedConnectedDeviceController
196                 .getConnectedDevicesSummaryResourceId(mNfcController, false, true))
197                 .isEqualTo(
198                     R.string.connected_devices_dashboard_android_auto_no_nfc_no_driving_mode);
199     }
200 
buildAndroidAutoSettingsIntent()201     private Intent buildAndroidAutoSettingsIntent() {
202         final Intent intent = new Intent("com.android.settings.action.IA_SETTINGS");
203         intent.setPackage(ANDROID_AUTO_PACKAGE);
204         return intent;
205     }
206 }
207 
208