1327b809ad11a5094248652014227470c4be329e6Jerry Zhang/*
2327b809ad11a5094248652014227470c4be329e6Jerry Zhang * Copyright (C) 2018 The Android Open Source Project
3327b809ad11a5094248652014227470c4be329e6Jerry Zhang *
4327b809ad11a5094248652014227470c4be329e6Jerry Zhang * Licensed under the Apache License, Version 2.0 (the "License");
5327b809ad11a5094248652014227470c4be329e6Jerry Zhang * you may not use this file except in compliance with the License.
6327b809ad11a5094248652014227470c4be329e6Jerry Zhang * You may obtain a copy of the License at
7327b809ad11a5094248652014227470c4be329e6Jerry Zhang *
8327b809ad11a5094248652014227470c4be329e6Jerry Zhang *      http://www.apache.org/licenses/LICENSE-2.0
9327b809ad11a5094248652014227470c4be329e6Jerry Zhang *
10327b809ad11a5094248652014227470c4be329e6Jerry Zhang * Unless required by applicable law or agreed to in writing, software
11327b809ad11a5094248652014227470c4be329e6Jerry Zhang * distributed under the License is distributed on an "AS IS" BASIS,
12327b809ad11a5094248652014227470c4be329e6Jerry Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13327b809ad11a5094248652014227470c4be329e6Jerry Zhang * See the License for the specific language governing permissions and
14327b809ad11a5094248652014227470c4be329e6Jerry Zhang * limitations under the License.
15327b809ad11a5094248652014227470c4be329e6Jerry Zhang */
16327b809ad11a5094248652014227470c4be329e6Jerry Zhangpackage com.android.server.usb;
17327b809ad11a5094248652014227470c4be329e6Jerry Zhang
18327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport static org.junit.Assert.assertEquals;
19327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport static org.junit.Assert.assertFalse;
20327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport static org.junit.Assert.assertNotEquals;
21327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport static org.junit.Assert.assertTrue;
22327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport static org.mockito.Mockito.verify;
23327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport static org.mockito.Mockito.when;
24327b809ad11a5094248652014227470c4be329e6Jerry Zhang
250d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhangimport android.app.ActivityManager;
26327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport android.content.ContentResolver;
27327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport android.content.Context;
28327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport android.content.Intent;
29327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport android.content.SharedPreferences;
30327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport android.hardware.usb.UsbManager;
31327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport android.os.Handler;
32327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport android.os.Looper;
330d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhangimport android.os.Message;
34327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport android.os.UserHandle;
35327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport android.provider.Settings;
36327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport android.support.test.InstrumentationRegistry;
37327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport android.support.test.filters.SmallTest;
38327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport android.support.test.runner.AndroidJUnit4;
39327b809ad11a5094248652014227470c4be329e6Jerry Zhang
40327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport com.android.server.FgThread;
41327b809ad11a5094248652014227470c4be329e6Jerry Zhang
42327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport org.junit.Before;
43327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport org.junit.Test;
44327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport org.junit.runner.RunWith;
45327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport org.mockito.Mock;
46327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport org.mockito.MockitoAnnotations;
47327b809ad11a5094248652014227470c4be329e6Jerry Zhang
48327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport java.util.HashMap;
49327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport java.util.Locale;
50327b809ad11a5094248652014227470c4be329e6Jerry Zhangimport java.util.Map;
51327b809ad11a5094248652014227470c4be329e6Jerry Zhang
52327b809ad11a5094248652014227470c4be329e6Jerry Zhang/**
53327b809ad11a5094248652014227470c4be329e6Jerry Zhang * Tests for UsbHandler state changes.
54327b809ad11a5094248652014227470c4be329e6Jerry Zhang */
55327b809ad11a5094248652014227470c4be329e6Jerry Zhang@RunWith(AndroidJUnit4.class)
56327b809ad11a5094248652014227470c4be329e6Jerry Zhangpublic class UsbHandlerTest {
57327b809ad11a5094248652014227470c4be329e6Jerry Zhang    private static final String TAG = UsbHandlerTest.class.getSimpleName();
58327b809ad11a5094248652014227470c4be329e6Jerry Zhang
59327b809ad11a5094248652014227470c4be329e6Jerry Zhang    @Mock
60327b809ad11a5094248652014227470c4be329e6Jerry Zhang    private UsbDeviceManager mUsbDeviceManager;
61327b809ad11a5094248652014227470c4be329e6Jerry Zhang    @Mock
62327b809ad11a5094248652014227470c4be329e6Jerry Zhang    private UsbDebuggingManager mUsbDebuggingManager;
63327b809ad11a5094248652014227470c4be329e6Jerry Zhang    @Mock
64327b809ad11a5094248652014227470c4be329e6Jerry Zhang    private UsbAlsaManager mUsbAlsaManager;
65327b809ad11a5094248652014227470c4be329e6Jerry Zhang    @Mock
66327b809ad11a5094248652014227470c4be329e6Jerry Zhang    private UsbSettingsManager mUsbSettingsManager;
67327b809ad11a5094248652014227470c4be329e6Jerry Zhang    @Mock
68327b809ad11a5094248652014227470c4be329e6Jerry Zhang    private SharedPreferences mSharedPreferences;
69327b809ad11a5094248652014227470c4be329e6Jerry Zhang    @Mock
70327b809ad11a5094248652014227470c4be329e6Jerry Zhang    private SharedPreferences.Editor mEditor;
71327b809ad11a5094248652014227470c4be329e6Jerry Zhang
72327b809ad11a5094248652014227470c4be329e6Jerry Zhang    private MockUsbHandler mUsbHandler;
73327b809ad11a5094248652014227470c4be329e6Jerry Zhang
74327b809ad11a5094248652014227470c4be329e6Jerry Zhang    private static final int MSG_UPDATE_STATE = 0;
75327b809ad11a5094248652014227470c4be329e6Jerry Zhang    private static final int MSG_ENABLE_ADB = 1;
76327b809ad11a5094248652014227470c4be329e6Jerry Zhang    private static final int MSG_SET_CURRENT_FUNCTIONS = 2;
77327b809ad11a5094248652014227470c4be329e6Jerry Zhang    private static final int MSG_SYSTEM_READY = 3;
78327b809ad11a5094248652014227470c4be329e6Jerry Zhang    private static final int MSG_BOOT_COMPLETED = 4;
79327b809ad11a5094248652014227470c4be329e6Jerry Zhang    private static final int MSG_USER_SWITCHED = 5;
80327b809ad11a5094248652014227470c4be329e6Jerry Zhang    private static final int MSG_UPDATE_USER_RESTRICTIONS = 6;
81327b809ad11a5094248652014227470c4be329e6Jerry Zhang    private static final int MSG_SET_SCREEN_UNLOCKED_FUNCTIONS = 12;
82327b809ad11a5094248652014227470c4be329e6Jerry Zhang    private static final int MSG_UPDATE_SCREEN_LOCK = 13;
83327b809ad11a5094248652014227470c4be329e6Jerry Zhang
84327b809ad11a5094248652014227470c4be329e6Jerry Zhang    private Map<String, String> mMockProperties;
85327b809ad11a5094248652014227470c4be329e6Jerry Zhang    private Map<String, Integer> mMockGlobalSettings;
86327b809ad11a5094248652014227470c4be329e6Jerry Zhang
87327b809ad11a5094248652014227470c4be329e6Jerry Zhang    private class MockUsbHandler extends UsbDeviceManager.UsbHandler {
88327b809ad11a5094248652014227470c4be329e6Jerry Zhang        boolean mIsUsbTransferAllowed;
89327b809ad11a5094248652014227470c4be329e6Jerry Zhang        Intent mBroadcastedIntent;
90327b809ad11a5094248652014227470c4be329e6Jerry Zhang
91327b809ad11a5094248652014227470c4be329e6Jerry Zhang        MockUsbHandler(Looper looper, Context context, UsbDeviceManager deviceManager,
92327b809ad11a5094248652014227470c4be329e6Jerry Zhang                UsbDebuggingManager debuggingManager, UsbAlsaManager alsaManager,
93327b809ad11a5094248652014227470c4be329e6Jerry Zhang                UsbSettingsManager settingsManager) {
94327b809ad11a5094248652014227470c4be329e6Jerry Zhang            super(looper, context, deviceManager, debuggingManager, alsaManager, settingsManager);
95327b809ad11a5094248652014227470c4be329e6Jerry Zhang            mUseUsbNotification = false;
96327b809ad11a5094248652014227470c4be329e6Jerry Zhang            mIsUsbTransferAllowed = true;
97327b809ad11a5094248652014227470c4be329e6Jerry Zhang            mCurrentUsbFunctionsReceived = true;
98327b809ad11a5094248652014227470c4be329e6Jerry Zhang        }
99327b809ad11a5094248652014227470c4be329e6Jerry Zhang
100327b809ad11a5094248652014227470c4be329e6Jerry Zhang        @Override
101327b809ad11a5094248652014227470c4be329e6Jerry Zhang        protected void setEnabledFunctions(long functions, boolean force) {
102327b809ad11a5094248652014227470c4be329e6Jerry Zhang            mCurrentFunctions = functions;
103327b809ad11a5094248652014227470c4be329e6Jerry Zhang        }
104327b809ad11a5094248652014227470c4be329e6Jerry Zhang
105327b809ad11a5094248652014227470c4be329e6Jerry Zhang        @Override
106327b809ad11a5094248652014227470c4be329e6Jerry Zhang        protected void setSystemProperty(String property, String value) {
107327b809ad11a5094248652014227470c4be329e6Jerry Zhang            mMockProperties.put(property, value);
108327b809ad11a5094248652014227470c4be329e6Jerry Zhang        }
109327b809ad11a5094248652014227470c4be329e6Jerry Zhang
110327b809ad11a5094248652014227470c4be329e6Jerry Zhang        @Override
111327b809ad11a5094248652014227470c4be329e6Jerry Zhang        protected void putGlobalSettings(ContentResolver resolver, String setting, int val) {
112327b809ad11a5094248652014227470c4be329e6Jerry Zhang            mMockGlobalSettings.put(setting, val);
113327b809ad11a5094248652014227470c4be329e6Jerry Zhang        }
114327b809ad11a5094248652014227470c4be329e6Jerry Zhang
115327b809ad11a5094248652014227470c4be329e6Jerry Zhang        @Override
116327b809ad11a5094248652014227470c4be329e6Jerry Zhang        protected String getSystemProperty(String property, String def) {
117327b809ad11a5094248652014227470c4be329e6Jerry Zhang            if (mMockProperties.containsKey(property)) {
118327b809ad11a5094248652014227470c4be329e6Jerry Zhang                return mMockProperties.get(property);
119327b809ad11a5094248652014227470c4be329e6Jerry Zhang            }
120327b809ad11a5094248652014227470c4be329e6Jerry Zhang            return def;
121327b809ad11a5094248652014227470c4be329e6Jerry Zhang        }
122327b809ad11a5094248652014227470c4be329e6Jerry Zhang
123327b809ad11a5094248652014227470c4be329e6Jerry Zhang        @Override
124327b809ad11a5094248652014227470c4be329e6Jerry Zhang        protected boolean isUsbTransferAllowed() {
125327b809ad11a5094248652014227470c4be329e6Jerry Zhang            return mIsUsbTransferAllowed;
126327b809ad11a5094248652014227470c4be329e6Jerry Zhang        }
127327b809ad11a5094248652014227470c4be329e6Jerry Zhang
128327b809ad11a5094248652014227470c4be329e6Jerry Zhang        @Override
129327b809ad11a5094248652014227470c4be329e6Jerry Zhang        protected SharedPreferences getPinnedSharedPrefs(Context context) {
130327b809ad11a5094248652014227470c4be329e6Jerry Zhang            return mSharedPreferences;
131327b809ad11a5094248652014227470c4be329e6Jerry Zhang        }
132327b809ad11a5094248652014227470c4be329e6Jerry Zhang
133327b809ad11a5094248652014227470c4be329e6Jerry Zhang        @Override
134327b809ad11a5094248652014227470c4be329e6Jerry Zhang        protected void sendStickyBroadcast(Intent intent) {
135327b809ad11a5094248652014227470c4be329e6Jerry Zhang            mBroadcastedIntent = intent;
136327b809ad11a5094248652014227470c4be329e6Jerry Zhang        }
137327b809ad11a5094248652014227470c4be329e6Jerry Zhang    }
138327b809ad11a5094248652014227470c4be329e6Jerry Zhang
139327b809ad11a5094248652014227470c4be329e6Jerry Zhang    @Before
140327b809ad11a5094248652014227470c4be329e6Jerry Zhang    public void before() {
141327b809ad11a5094248652014227470c4be329e6Jerry Zhang        MockitoAnnotations.initMocks(this);
142327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mMockProperties = new HashMap<>();
143327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mMockGlobalSettings = new HashMap<>();
144327b809ad11a5094248652014227470c4be329e6Jerry Zhang        when(mSharedPreferences.edit()).thenReturn(mEditor);
145327b809ad11a5094248652014227470c4be329e6Jerry Zhang
146327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mUsbHandler = new MockUsbHandler(FgThread.get().getLooper(),
147327b809ad11a5094248652014227470c4be329e6Jerry Zhang                InstrumentationRegistry.getContext(), mUsbDeviceManager, mUsbDebuggingManager,
148327b809ad11a5094248652014227470c4be329e6Jerry Zhang                mUsbAlsaManager, mUsbSettingsManager);
149327b809ad11a5094248652014227470c4be329e6Jerry Zhang    }
150327b809ad11a5094248652014227470c4be329e6Jerry Zhang
151327b809ad11a5094248652014227470c4be329e6Jerry Zhang    @SmallTest
1520d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang    @Test
153327b809ad11a5094248652014227470c4be329e6Jerry Zhang    public void setFunctionsMtp() {
154327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
155327b809ad11a5094248652014227470c4be329e6Jerry Zhang                UsbManager.FUNCTION_MTP));
156327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_MTP, 0);
157327b809ad11a5094248652014227470c4be329e6Jerry Zhang    }
158327b809ad11a5094248652014227470c4be329e6Jerry Zhang
159327b809ad11a5094248652014227470c4be329e6Jerry Zhang    @SmallTest
1600d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang    @Test
161327b809ad11a5094248652014227470c4be329e6Jerry Zhang    public void setFunctionsPtp() {
162327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
163327b809ad11a5094248652014227470c4be329e6Jerry Zhang                UsbManager.FUNCTION_PTP));
164327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_PTP, 0);
165327b809ad11a5094248652014227470c4be329e6Jerry Zhang    }
166327b809ad11a5094248652014227470c4be329e6Jerry Zhang
167327b809ad11a5094248652014227470c4be329e6Jerry Zhang    @SmallTest
1680d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang    @Test
169327b809ad11a5094248652014227470c4be329e6Jerry Zhang    public void setFunctionsMidi() {
170327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
171327b809ad11a5094248652014227470c4be329e6Jerry Zhang                UsbManager.FUNCTION_MIDI));
172327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_MIDI, 0);
173327b809ad11a5094248652014227470c4be329e6Jerry Zhang    }
174327b809ad11a5094248652014227470c4be329e6Jerry Zhang
175327b809ad11a5094248652014227470c4be329e6Jerry Zhang    @SmallTest
1760d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang    @Test
177327b809ad11a5094248652014227470c4be329e6Jerry Zhang    public void setFunctionsRndis() {
178327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
179327b809ad11a5094248652014227470c4be329e6Jerry Zhang                UsbManager.FUNCTION_RNDIS));
180327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_RNDIS, 0);
181327b809ad11a5094248652014227470c4be329e6Jerry Zhang    }
182327b809ad11a5094248652014227470c4be329e6Jerry Zhang
183327b809ad11a5094248652014227470c4be329e6Jerry Zhang    @SmallTest
1840d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang    @Test
185327b809ad11a5094248652014227470c4be329e6Jerry Zhang    public void enableAdb() {
186327b809ad11a5094248652014227470c4be329e6Jerry Zhang        sendBootCompleteMessages(mUsbHandler);
1870d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang        Message msg = mUsbHandler.obtainMessage(MSG_ENABLE_ADB);
1880d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang        msg.arg1 = 1;
1890d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang        mUsbHandler.handleMessage(msg);
190327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertEquals(mUsbHandler.getEnabledFunctions(), UsbManager.FUNCTION_NONE);
191327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertEquals(mMockProperties.get(UsbDeviceManager.UsbHandler
192327b809ad11a5094248652014227470c4be329e6Jerry Zhang                .USB_PERSISTENT_CONFIG_PROPERTY), UsbManager.USB_FUNCTION_ADB);
193327b809ad11a5094248652014227470c4be329e6Jerry Zhang        verify(mUsbDebuggingManager).setAdbEnabled(true);
1940d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang        assertTrue(mUsbHandler.mAdbEnabled);
195327b809ad11a5094248652014227470c4be329e6Jerry Zhang
196327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_UPDATE_STATE, 1, 1));
197327b809ad11a5094248652014227470c4be329e6Jerry Zhang
198327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertTrue(mUsbHandler.mBroadcastedIntent.getBooleanExtra(UsbManager.USB_CONNECTED, false));
199327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertTrue(mUsbHandler.mBroadcastedIntent
200327b809ad11a5094248652014227470c4be329e6Jerry Zhang                .getBooleanExtra(UsbManager.USB_CONFIGURED, false));
201327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertTrue(mUsbHandler.mBroadcastedIntent
202327b809ad11a5094248652014227470c4be329e6Jerry Zhang                .getBooleanExtra(UsbManager.USB_FUNCTION_ADB, false));
203327b809ad11a5094248652014227470c4be329e6Jerry Zhang    }
204327b809ad11a5094248652014227470c4be329e6Jerry Zhang
205327b809ad11a5094248652014227470c4be329e6Jerry Zhang    @SmallTest
2060d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang    @Test
207327b809ad11a5094248652014227470c4be329e6Jerry Zhang    public void disableAdb() {
208327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mMockProperties.put(UsbDeviceManager.UsbHandler.USB_PERSISTENT_CONFIG_PROPERTY,
209327b809ad11a5094248652014227470c4be329e6Jerry Zhang                UsbManager.USB_FUNCTION_ADB);
210327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mUsbHandler = new MockUsbHandler(FgThread.get().getLooper(),
211327b809ad11a5094248652014227470c4be329e6Jerry Zhang                InstrumentationRegistry.getContext(), mUsbDeviceManager, mUsbDebuggingManager,
212327b809ad11a5094248652014227470c4be329e6Jerry Zhang                mUsbAlsaManager, mUsbSettingsManager);
213327b809ad11a5094248652014227470c4be329e6Jerry Zhang
214327b809ad11a5094248652014227470c4be329e6Jerry Zhang        sendBootCompleteMessages(mUsbHandler);
215327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_ENABLE_ADB, 0));
216327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertEquals(mUsbHandler.getEnabledFunctions(), UsbManager.FUNCTION_NONE);
217327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertFalse(mUsbHandler.mAdbEnabled);
218327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertEquals(mMockProperties.get(UsbDeviceManager.UsbHandler
219327b809ad11a5094248652014227470c4be329e6Jerry Zhang                .USB_PERSISTENT_CONFIG_PROPERTY), "");
220327b809ad11a5094248652014227470c4be329e6Jerry Zhang        verify(mUsbDebuggingManager).setAdbEnabled(false);
221327b809ad11a5094248652014227470c4be329e6Jerry Zhang    }
222327b809ad11a5094248652014227470c4be329e6Jerry Zhang
223327b809ad11a5094248652014227470c4be329e6Jerry Zhang    @SmallTest
2240d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang    @Test
225327b809ad11a5094248652014227470c4be329e6Jerry Zhang    public void bootCompletedCharging() {
226327b809ad11a5094248652014227470c4be329e6Jerry Zhang        sendBootCompleteMessages(mUsbHandler);
227327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertEquals(mUsbHandler.getEnabledFunctions(), UsbManager.FUNCTION_NONE);
228327b809ad11a5094248652014227470c4be329e6Jerry Zhang    }
229327b809ad11a5094248652014227470c4be329e6Jerry Zhang
230327b809ad11a5094248652014227470c4be329e6Jerry Zhang    @SmallTest
2310d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang    @Test
232327b809ad11a5094248652014227470c4be329e6Jerry Zhang    public void bootCompletedAdbEnabled() {
233327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mMockProperties.put(UsbDeviceManager.UsbHandler.USB_PERSISTENT_CONFIG_PROPERTY, "adb");
234327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mUsbHandler = new MockUsbHandler(FgThread.get().getLooper(),
235327b809ad11a5094248652014227470c4be329e6Jerry Zhang                InstrumentationRegistry.getContext(), mUsbDeviceManager, mUsbDebuggingManager,
236327b809ad11a5094248652014227470c4be329e6Jerry Zhang                mUsbAlsaManager, mUsbSettingsManager);
237327b809ad11a5094248652014227470c4be329e6Jerry Zhang
238327b809ad11a5094248652014227470c4be329e6Jerry Zhang        sendBootCompleteMessages(mUsbHandler);
239327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertEquals(mUsbHandler.getEnabledFunctions(), UsbManager.FUNCTION_NONE);
240327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertEquals(mMockGlobalSettings.get(Settings.Global.ADB_ENABLED).intValue(), 1);
241327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertTrue(mUsbHandler.mAdbEnabled);
242327b809ad11a5094248652014227470c4be329e6Jerry Zhang        verify(mUsbDebuggingManager).setAdbEnabled(true);
243327b809ad11a5094248652014227470c4be329e6Jerry Zhang    }
244327b809ad11a5094248652014227470c4be329e6Jerry Zhang
245327b809ad11a5094248652014227470c4be329e6Jerry Zhang    @SmallTest
2460d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang    @Test
247327b809ad11a5094248652014227470c4be329e6Jerry Zhang    public void userSwitchedDisablesMtp() {
248327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
249327b809ad11a5094248652014227470c4be329e6Jerry Zhang                UsbManager.FUNCTION_MTP));
250327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_MTP, 0);
251327b809ad11a5094248652014227470c4be329e6Jerry Zhang
2520d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang        Message msg = mUsbHandler.obtainMessage(MSG_USER_SWITCHED);
2530d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang        msg.arg1 = ActivityManager.getCurrentUser() + 1;
2540d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang        mUsbHandler.handleMessage(msg);
255327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertEquals(mUsbHandler.getEnabledFunctions(), UsbManager.FUNCTION_NONE);
256327b809ad11a5094248652014227470c4be329e6Jerry Zhang    }
257327b809ad11a5094248652014227470c4be329e6Jerry Zhang
258327b809ad11a5094248652014227470c4be329e6Jerry Zhang    @SmallTest
2590d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang    @Test
260327b809ad11a5094248652014227470c4be329e6Jerry Zhang    public void changedRestrictionsDisablesMtp() {
261327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
262327b809ad11a5094248652014227470c4be329e6Jerry Zhang                UsbManager.FUNCTION_MTP));
263327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_MTP, 0);
264327b809ad11a5094248652014227470c4be329e6Jerry Zhang
265327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mUsbHandler.mIsUsbTransferAllowed = false;
266327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_UPDATE_USER_RESTRICTIONS));
267327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertEquals(mUsbHandler.getEnabledFunctions(), UsbManager.FUNCTION_NONE);
268327b809ad11a5094248652014227470c4be329e6Jerry Zhang    }
269327b809ad11a5094248652014227470c4be329e6Jerry Zhang
270327b809ad11a5094248652014227470c4be329e6Jerry Zhang    @SmallTest
2710d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang    @Test
272327b809ad11a5094248652014227470c4be329e6Jerry Zhang    public void disconnectResetsCharging() {
273327b809ad11a5094248652014227470c4be329e6Jerry Zhang        sendBootCompleteMessages(mUsbHandler);
274327b809ad11a5094248652014227470c4be329e6Jerry Zhang
275327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
276327b809ad11a5094248652014227470c4be329e6Jerry Zhang                UsbManager.FUNCTION_MTP));
277327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_MTP, 0);
278327b809ad11a5094248652014227470c4be329e6Jerry Zhang
279327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_UPDATE_STATE, 0, 0));
280327b809ad11a5094248652014227470c4be329e6Jerry Zhang
281327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertEquals(mUsbHandler.getEnabledFunctions(), UsbManager.FUNCTION_NONE);
282327b809ad11a5094248652014227470c4be329e6Jerry Zhang    }
283327b809ad11a5094248652014227470c4be329e6Jerry Zhang
284327b809ad11a5094248652014227470c4be329e6Jerry Zhang    @SmallTest
2850d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang    @Test
286327b809ad11a5094248652014227470c4be329e6Jerry Zhang    public void configuredSendsBroadcast() {
287327b809ad11a5094248652014227470c4be329e6Jerry Zhang        sendBootCompleteMessages(mUsbHandler);
288327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_CURRENT_FUNCTIONS,
289327b809ad11a5094248652014227470c4be329e6Jerry Zhang                UsbManager.FUNCTION_MTP));
290327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_MTP, 0);
291327b809ad11a5094248652014227470c4be329e6Jerry Zhang
292327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_UPDATE_STATE, 1, 1));
293327b809ad11a5094248652014227470c4be329e6Jerry Zhang
294327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_MTP, 0);
295327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertTrue(mUsbHandler.mBroadcastedIntent.getBooleanExtra(UsbManager.USB_CONNECTED, false));
296327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertTrue(mUsbHandler.mBroadcastedIntent
297327b809ad11a5094248652014227470c4be329e6Jerry Zhang                .getBooleanExtra(UsbManager.USB_CONFIGURED, false));
298327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertTrue(mUsbHandler.mBroadcastedIntent
299327b809ad11a5094248652014227470c4be329e6Jerry Zhang                .getBooleanExtra(UsbManager.USB_FUNCTION_MTP, false));
300327b809ad11a5094248652014227470c4be329e6Jerry Zhang    }
301327b809ad11a5094248652014227470c4be329e6Jerry Zhang
302327b809ad11a5094248652014227470c4be329e6Jerry Zhang    @SmallTest
3030d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang    @Test
304327b809ad11a5094248652014227470c4be329e6Jerry Zhang    public void setScreenUnlockedFunctions() {
305327b809ad11a5094248652014227470c4be329e6Jerry Zhang        sendBootCompleteMessages(mUsbHandler);
306327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_UPDATE_SCREEN_LOCK, 0));
307327b809ad11a5094248652014227470c4be329e6Jerry Zhang
308327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_SET_SCREEN_UNLOCKED_FUNCTIONS,
309327b809ad11a5094248652014227470c4be329e6Jerry Zhang                UsbManager.FUNCTION_MTP));
310327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertNotEquals(mUsbHandler.getScreenUnlockedFunctions() & UsbManager.FUNCTION_MTP, 0);
311327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_MTP, 0);
312327b809ad11a5094248652014227470c4be329e6Jerry Zhang        verify(mEditor).putString(String.format(Locale.ENGLISH,
313327b809ad11a5094248652014227470c4be329e6Jerry Zhang                UsbDeviceManager.UNLOCKED_CONFIG_PREF, mUsbHandler.mCurrentUser),
314327b809ad11a5094248652014227470c4be329e6Jerry Zhang                UsbManager.USB_FUNCTION_MTP);
315327b809ad11a5094248652014227470c4be329e6Jerry Zhang    }
316327b809ad11a5094248652014227470c4be329e6Jerry Zhang
317327b809ad11a5094248652014227470c4be329e6Jerry Zhang    @SmallTest
3180d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang    @Test
319327b809ad11a5094248652014227470c4be329e6Jerry Zhang    public void unlockScreen() {
320327b809ad11a5094248652014227470c4be329e6Jerry Zhang        when(mSharedPreferences.getString(String.format(Locale.ENGLISH,
321327b809ad11a5094248652014227470c4be329e6Jerry Zhang                UsbDeviceManager.UNLOCKED_CONFIG_PREF, mUsbHandler.mCurrentUser), ""))
322327b809ad11a5094248652014227470c4be329e6Jerry Zhang                .thenReturn(UsbManager.USB_FUNCTION_MTP);
3230d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang        mUsbHandler = new MockUsbHandler(FgThread.get().getLooper(),
3240d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang                InstrumentationRegistry.getContext(), mUsbDeviceManager, mUsbDebuggingManager,
3250d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang                mUsbAlsaManager, mUsbSettingsManager);
326327b809ad11a5094248652014227470c4be329e6Jerry Zhang        sendBootCompleteMessages(mUsbHandler);
3270d3aa08a2f0cb82adb936e26d4de2b14408a1dd9Jerry Zhang        mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_UPDATE_SCREEN_LOCK, 1));
328327b809ad11a5094248652014227470c4be329e6Jerry Zhang        mUsbHandler.handleMessage(mUsbHandler.obtainMessage(MSG_UPDATE_SCREEN_LOCK, 0));
329327b809ad11a5094248652014227470c4be329e6Jerry Zhang
330327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertNotEquals(mUsbHandler.getScreenUnlockedFunctions() & UsbManager.FUNCTION_MTP, 0);
331327b809ad11a5094248652014227470c4be329e6Jerry Zhang        assertNotEquals(mUsbHandler.getEnabledFunctions() & UsbManager.FUNCTION_MTP, 0);
332327b809ad11a5094248652014227470c4be329e6Jerry Zhang    }
333327b809ad11a5094248652014227470c4be329e6Jerry Zhang
334327b809ad11a5094248652014227470c4be329e6Jerry Zhang    private static void sendBootCompleteMessages(Handler handler) {
335327b809ad11a5094248652014227470c4be329e6Jerry Zhang        handler.handleMessage(handler.obtainMessage(MSG_BOOT_COMPLETED));
336327b809ad11a5094248652014227470c4be329e6Jerry Zhang        handler.handleMessage(handler.obtainMessage(MSG_SYSTEM_READY));
337327b809ad11a5094248652014227470c4be329e6Jerry Zhang    }
338327b809ad11a5094248652014227470c4be329e6Jerry Zhang}