/*------------------------------------------------------------------------- * drawElements Quality Program Tester Core * ---------------------------------------- * * Copyright 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *//*! * \file * \brief TesterCore remote interface. *//*--------------------------------------------------------------------*/ package com.drawelements.deqp.testercore; import android.app.ActivityManager; import android.content.Context; import android.content.ComponentName; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Process; import android.os.Build; import android.text.TextUtils; import java.lang.System; import java.util.List; public class RemoteAPI { private static final String LOG_TAG = "dEQP/RemoteAPI"; private Context m_context; private String m_processName; private String m_logFileName; public RemoteAPI (Context context, String logFileName) { m_context = context; m_processName = m_context.getPackageName() + ":testercore"; m_logFileName = logFileName; } private ComponentName getDefaultTesterComponent () { return new ComponentName(m_context.getPackageName(), "android.app.NativeActivity"); } private ComponentName getTesterComponent (String testerName) { if (testerName != null && !testerName.equals("")) { ComponentName component = ComponentName.unflattenFromString(testerName); if (component == null) { Log.e(LOG_TAG, "Invalid component name supplied (" + testerName + "), using default"); component = getDefaultTesterComponent(); } return component; } else { return getDefaultTesterComponent(); } } public boolean start (String testerName, String cmdLine, String caseList) { // Choose component ComponentName component = getTesterComponent(testerName); Intent testIntent = new Intent(); testIntent.setComponent(component); testIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // Add all data to cmdLine cmdLine = testerName + " " + cmdLine + " --deqp-log-filename=" + m_logFileName; if (caseList != null) cmdLine = cmdLine + " --deqp-caselist=" + caseList; cmdLine = cmdLine.replaceAll(" ", " "); testIntent.putExtra("cmdLine", cmdLine); // Try to resolve intent. boolean isActivity = m_context.getPackageManager().resolveActivity(testIntent, 0) != null; boolean isService = m_context.getPackageManager().resolveService(testIntent, 0) != null; if (!isActivity && !isService) { Log.e(LOG_TAG, "Can't resolve component as activity or service (" + component.flattenToString() + "), using default"); component = getDefaultTesterComponent(); } Log.d(LOG_TAG, "Starting activity " + component.flattenToString()); try { if (isService) m_context.startService(testIntent); else m_context.startActivity(testIntent); } catch (Exception e) { Log.e(LOG_TAG, "Failed to start tester", e); return false; } return true; } public boolean kill () { ActivityManager.RunningAppProcessInfo processInfo = findProcess(m_processName); if (processInfo != null) { Log.d(LOG_TAG, "Killing " + m_processName); Process.killProcess(processInfo.pid); return true; } else { return false; } // \todo [2010-11-01 pyry] Block until tester process is not running? } public boolean isRunning () { return isProcessRunning(m_processName); } public String getLogFileName () { return m_logFileName; } private ActivityManager.RunningAppProcessInfo findProcess (String name) { ActivityManager activityMgr = (ActivityManager)m_context.getSystemService(Context.ACTIVITY_SERVICE); List processes = activityMgr.getRunningAppProcesses(); for (ActivityManager.RunningAppProcessInfo info : processes) { // Log.v(LOG_TAG, "Found proc : " + info.processName + " " + info.pid); if (info.processName.equals(name)) return info; } return null; } private boolean isProcessRunning (String processName) { // Log.d(LOG_TAG, "isProcessRunning(): " + processName); return (findProcess(processName) != null); } }