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