1 /*------------------------------------------------------------------------- 2 * drawElements Quality Program Tester Core 3 * ---------------------------------------- 4 * 5 * Copyright 2014 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 *//*! 20 * \file 21 * \brief TesterCore remote interface. 22 *//*--------------------------------------------------------------------*/ 23 24 package com.drawelements.deqp.testercore; 25 26 import android.app.ActivityManager; 27 import android.content.Context; 28 import android.content.ComponentName; 29 import android.content.Intent; 30 import android.os.Process; 31 32 import java.util.List; 33 34 public class RemoteAPI { 35 36 private static final String LOG_TAG = "dEQP"; 37 38 private Context m_context; 39 private String m_processName; 40 private String m_logFileName; 41 private boolean m_canBeRunning; 42 RemoteAPI(Context context, String logFileName)43 public RemoteAPI (Context context, String logFileName) { 44 m_context = context; 45 m_processName = m_context.getPackageName() + ":testercore"; 46 m_logFileName = logFileName; 47 m_canBeRunning = false; 48 } 49 getDefaultTesterComponent()50 private ComponentName getDefaultTesterComponent () { 51 return new ComponentName(m_context.getPackageName(), "android.app.NativeActivity"); 52 } 53 getTesterComponent(String testerName)54 private ComponentName getTesterComponent (String testerName) { 55 if (testerName != null && !testerName.equals("")) { 56 ComponentName component = ComponentName.unflattenFromString(testerName); 57 if (component == null) { 58 Log.e(LOG_TAG, "Invalid component name supplied (" + testerName + "), using default"); 59 component = getDefaultTesterComponent(); 60 } 61 return component; 62 } else { 63 return getDefaultTesterComponent(); 64 } 65 } 66 start(String testerName, String cmdLine, String caseList)67 public boolean start (String testerName, String cmdLine, String caseList) { 68 69 // Choose component 70 ComponentName component = getTesterComponent(testerName); 71 72 Intent testIntent = new Intent(); 73 testIntent.setComponent(component); 74 testIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 75 76 // Add all data to cmdLine 77 cmdLine = testerName + " " + cmdLine + " --deqp-log-filename=" + m_logFileName; 78 79 if (caseList != null) 80 cmdLine = cmdLine + " --deqp-caselist=" + caseList; 81 82 cmdLine = cmdLine.replaceAll(" ", " "); 83 testIntent.putExtra("cmdLine", cmdLine); 84 85 // Try to resolve intent. 86 boolean isActivity = m_context.getPackageManager().resolveActivity(testIntent, 0) != null; 87 boolean isService = m_context.getPackageManager().resolveService(testIntent, 0) != null; 88 89 if (!isActivity && !isService) { 90 Log.e(LOG_TAG, "Can't resolve component as activity or service (" + component.flattenToString() + "), using default"); 91 component = getDefaultTesterComponent(); 92 } 93 94 Log.d(LOG_TAG, "Starting activity " + component.flattenToString()); 95 96 try { 97 if (isService) 98 m_context.startService(testIntent); 99 else 100 m_context.startActivity(testIntent); 101 } catch (Exception e) { 102 Log.e(LOG_TAG, "Failed to start tester", e); 103 return false; 104 } 105 106 m_canBeRunning = true; 107 return true; 108 } 109 kill()110 public boolean kill () { 111 ActivityManager.RunningAppProcessInfo processInfo = findProcess(m_processName); 112 113 // \note not mutating m_canBeRunning yet since process does not die immediately 114 115 if (processInfo != null) { 116 Log.d(LOG_TAG, "Killing " + m_processName); 117 Process.killProcess(processInfo.pid); 118 return true; 119 } else { 120 return false; 121 } 122 123 // \todo [2010-11-01 pyry] Block until tester process is not running? 124 } 125 isRunning()126 public boolean isRunning () { 127 if (!m_canBeRunning) { 128 return false; 129 } else if (isProcessRunning(m_processName)) { 130 return true; 131 } else { 132 // Cache result. Safe, because only start() can spawn the process 133 m_canBeRunning = false; 134 return false; 135 } 136 } 137 getLogFileName()138 public String getLogFileName () { 139 return m_logFileName; 140 } 141 findProcess(String name)142 private ActivityManager.RunningAppProcessInfo findProcess (String name) { 143 ActivityManager activityMgr = (ActivityManager)m_context.getSystemService(Context.ACTIVITY_SERVICE); 144 List<ActivityManager.RunningAppProcessInfo> processes = activityMgr.getRunningAppProcesses(); 145 146 for (ActivityManager.RunningAppProcessInfo info : processes) { 147 // Log.v(LOG_TAG, "Found proc : " + info.processName + " " + info.pid); 148 if (info.processName.equals(name)) 149 return info; 150 } 151 152 return null; 153 } 154 isProcessRunning(String processName)155 private boolean isProcessRunning (String processName) { 156 // Log.d(LOG_TAG, "isProcessRunning(): " + processName); 157 return (findProcess(processName) != null); 158 } 159 } 160