13289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu 23289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhupackage com.android.testing.uiautomation; 33289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu 43289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhuimport android.content.Context; 53289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhuimport android.content.Intent; 63289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhuimport android.content.pm.IPackageManager; 73289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhuimport android.content.pm.ResolveInfo; 83289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhuimport android.os.RemoteException; 93289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhuimport android.os.ServiceManager; 103289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhuimport android.os.SystemClock; 113289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhuimport android.util.Log; 123289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu 133289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhuimport java.util.List; 143289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhuimport java.util.Map; 153289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhuimport java.util.TreeMap; 163289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu 173289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhupublic class UiTestHelper { 183289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu 193289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu private static final String LOGTAG = "UiTestHelper"; 203289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu 213289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu private static final long DEFAULT_WAIT_TIMEOUT = 5000; 223289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu 233289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu private static final long POLL_INTERVAL = 250; 243289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu 253289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu private Context mContext; 263289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu private AutomationProvider mProvider; 273289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu private Map<String, Intent> mLauncherAppList; 283289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu 293289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu public UiTestHelper(Context context, AutomationProvider provider) { 303289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu mContext = context; 313289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu mProvider = provider; 323289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu reloadLauncherAppList(); 333289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu } 343289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu 353289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu public boolean waitForWindow(String title) { 363289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu return waitForWindow(title, DEFAULT_WAIT_TIMEOUT); 373289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu } 383289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu 393289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu public boolean waitForWindow(String title, long timeout) { 403289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu long startMills = SystemClock.uptimeMillis(); 413289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu boolean titleMatch = false; 423289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu while (SystemClock.uptimeMillis() - startMills < timeout) { 433289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu try { 443289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu titleMatch = title.equals(mProvider.getCurrentActivityName()); 453289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu } catch (RemoteException e) { 463289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu Log.e(LOGTAG, "failed to get current activity name", e); 473289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu break; 483289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu } 493289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu if (titleMatch) 503289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu break; 513289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu try { 523289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu Thread.sleep(POLL_INTERVAL); 533289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu } catch (InterruptedException e) { 543289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu } 553289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu } 563289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu return titleMatch; 573289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu } 583289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu 593289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu public void reloadLauncherAppList() { 603289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu mLauncherAppList = getLauncherAppList(); 613289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu } 623289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu 633289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu public boolean launchApplication(String appName) { 643289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu Intent intent = mLauncherAppList.get(appName); 653289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu if (intent == null) 663289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu return false; 673289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu mContext.startActivity(intent); 683289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu return true; 693289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu } 703289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu 713289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu private Map<String, Intent> getLauncherAppList() { 723289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu final Intent queryIntent = new Intent(); 733289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu final Map<String, Intent> launchIntents = new TreeMap<String, Intent>(); 743289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu // get package manager and query pm for intents declared by apps as 753289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu // launcher and main 763289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu // basically those shown as icons in all apps screen 773289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu IPackageManager mPm = IPackageManager.Stub 783289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu .asInterface(ServiceManager.getService("package")); 793289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu queryIntent.addCategory(Intent.CATEGORY_LAUNCHER); 803289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu queryIntent.setAction(Intent.ACTION_MAIN); 813289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu final List<ResolveInfo> results; 823289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu try { 833289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu results = mPm.queryIntentActivities(queryIntent, null, 0); 843289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu } catch (RemoteException e) { 853289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu e.printStackTrace(); 863289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu return null; 873289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu } 883289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu for (ResolveInfo info : results) { 893289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu Intent tmpIntent = new Intent(queryIntent); 903289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu tmpIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 913289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu tmpIntent.setClassName(info.activityInfo.applicationInfo.packageName, 923289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu info.activityInfo.name); 933289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu String appName = info.activityInfo.loadLabel(mContext.getPackageManager()).toString(); 943289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu launchIntents.put(appName, tmpIntent); 953289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu } 963289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu return launchIntents; 973289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu } 983289993e2a4268614a5cfb421811fb23cdf43c9cGuang Zhu} 99