118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu/* 218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Copyright (C) 2012 The Android Open Source Project 318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Licensed under the Apache License, Version 2.0 (the "License"); 518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * you may not use this file except in compliance with the License. 618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * You may obtain a copy of the License at 718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * http://www.apache.org/licenses/LICENSE-2.0 918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 1018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Unless required by applicable law or agreed to in writing, software 1118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * distributed under the License is distributed on an "AS IS" BASIS, 1218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * See the License for the specific language governing permissions and 1418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * limitations under the License. 1518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu */ 1618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 1718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhupackage com.android.uiautomator.core; 1818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 1918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.app.ActivityManagerNative; 2018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.app.IActivityManager; 2118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.app.IActivityManager.ContentProviderHolder; 2218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.app.UiAutomation; 2318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.content.Context; 2418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.content.IContentProvider; 2518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.database.Cursor; 2618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.hardware.display.DisplayManagerGlobal; 2718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.os.Binder; 2818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.os.IBinder; 2918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.os.IPowerManager; 3018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.os.RemoteException; 3118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.os.ServiceManager; 3218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.os.UserHandle; 3318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.provider.Settings; 3418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.util.Log; 3518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.view.Display; 3618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.view.IWindowManager; 3718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 3818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu/** 3918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * @hide 4018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu */ 4118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhupublic class ShellUiAutomatorBridge extends UiAutomatorBridge { 4218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 4318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu private static final String LOG_TAG = ShellUiAutomatorBridge.class.getSimpleName(); 4418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 4518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public ShellUiAutomatorBridge(UiAutomation uiAutomation) { 4618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu super(uiAutomation); 4718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 4818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 4918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public Display getDefaultDisplay() { 5018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return DisplayManagerGlobal.getInstance().getRealDisplay(Display.DEFAULT_DISPLAY); 5118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 5218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 5318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public long getSystemLongPressTime() { 5418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu // Read the long press timeout setting. 5518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu long longPressTimeout = 0; 5618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu try { 5718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu IContentProvider provider = null; 5818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu Cursor cursor = null; 5918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu IActivityManager activityManager = ActivityManagerNative.getDefault(); 6018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu String providerName = Settings.Secure.CONTENT_URI.getAuthority(); 6118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu IBinder token = new Binder(); 6218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu try { 6318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu ContentProviderHolder holder = activityManager.getContentProviderExternal( 6418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu providerName, UserHandle.USER_OWNER, token); 6518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu if (holder == null) { 6618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu throw new IllegalStateException("Could not find provider: " + providerName); 6718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 6818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu provider = holder.provider; 6918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu cursor = provider.query(null, Settings.Secure.CONTENT_URI, 7018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu new String[] { 7118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu Settings.Secure.VALUE 7218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu }, "name=?", 7318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu new String[] { 7418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu Settings.Secure.LONG_PRESS_TIMEOUT 7518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu }, null, null); 7618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu if (cursor.moveToFirst()) { 7718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu longPressTimeout = cursor.getInt(0); 7818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 7918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } finally { 8018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu if (cursor != null) { 8118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu cursor.close(); 8218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 8318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu if (provider != null) { 8418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu activityManager.removeContentProviderExternal(providerName, token); 8518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 8618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 8718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } catch (RemoteException e) { 8818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu String message = "Error reading long press timeout setting."; 8918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu Log.e(LOG_TAG, message, e); 9018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu throw new RuntimeException(message, e); 9118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 9218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return longPressTimeout; 9318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 9418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 9518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu @Override 9618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public int getRotation() { 9718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu IWindowManager wm = 9818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu IWindowManager.Stub.asInterface(ServiceManager.getService(Context.WINDOW_SERVICE)); 9918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu int ret = -1; 10018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu try { 10118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu ret = wm.getRotation(); 10218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } catch (RemoteException e) { 10318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu Log.e(LOG_TAG, "Error getting screen rotation", e); 10418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu throw new RuntimeException(e); 10518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 10618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return ret; 10718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 10818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 10918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu @Override 11018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public boolean isScreenOn() { 11118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu IPowerManager pm = 11218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu IPowerManager.Stub.asInterface(ServiceManager.getService(Context.POWER_SERVICE)); 11318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu boolean ret = false; 11418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu try { 11518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu ret = pm.isInteractive(); 11618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } catch (RemoteException e) { 11718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu Log.e(LOG_TAG, "Error getting screen status", e); 11818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu throw new RuntimeException(e); 11918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 12018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return ret; 12118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 12218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu} 123