/*
* Tencent is pleased to support the open source community by making
* Tencent GT (Version 2.4 and subsequent versions) available.
*
* Notwithstanding anything to the contrary herein, any previous version
* of Tencent GT shall not be subject to the license hereunder.
* All right, title, and interest, including all intellectual property rights,
* in and to the previous version of Tencent GT (including any and all copies thereof)
* shall be owned and retained by Tencent and subject to the license under the
* Tencent GT End User License Agreement (http://gt.qq.com/wp-content/EULA_EN.html).
*
* Copyright (C) 2015 THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the MIT License (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of the License at
*
* http://opensource.org/licenses/MIT
*
* 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.
*/
package com.tencent.wstt.gt.client;
import android.content.Context;
import android.os.Bundle;
import com.tencent.wstt.gt.client.internal.GTInternal;
/**
* GT在被测APP中的接口类,提供给被测APP使用的所有接口都放在本类中作为静态方法提供。
*/
public class GT {
// GT开关,调试版本可以打开该开关,发布版本请关闭该开关
private static boolean ENABLE = true;
/**
* 是否使用GT调试的开关
* @param flag
*/
public static void setEnable(boolean flag)
{
ENABLE = flag;
}
/**
* 获取当前GT调试的开关是否打开
*/
public static boolean isEnable()
{
return ENABLE;
}
/**
* 连接到GT控制台应用,如GT控制台未启动,则会被异步拉起。<p>
* 建议在被测App启动的Application或首个Activity的onCreat方法中调用。
* 该方法可以重复调用,以第一次调用为准。如放在首个Activity的onResume方法中调用。
* 示例:
* @par
* @code
* GT.connect(getApplicationContext(), new AbsGTParaLoader() {
@Override
public void loadInParas(InParaManager inPara) {
// 定义入参:变量名、缩写名、入参默认值及备选值
inPara.register("pkPlan", "PKPL","plan2","originalPlan", "plan1");
inPara.register("超时时间", "RTO", "5", "2", "1","3");
inPara.register("segmentSize", "SS", "2048", "1024");
// 启动时默认放到GT控制台悬浮窗中展示的入参,如超过三个,只显示前三个
inPara.defaultInParasInAC("pkPlan", "超时时间");
}
@Override
public void loadOutParas(OutParaManager outPara) {
// 定义出参:变量名、缩写名
outPara.register("NetType", "NTPE");
outPara.register("NetSpeed", "NSPD");
outPara.register("SendFileSize", "SFS");
outPara.register("发送成功率", "SSR");
outPara.register("接收成功率", "RSR");
// 启动时默认放到GT控制台悬浮窗中展示的出参,如超过三个,只显示前三个
outPara.defaultOutParasInAC("发送成功率", "NetType", "SendFileSize");
}
});
* @endcode
* @param
* hostContext 被测应用的Context,因为GT模块会保持这个Context对象的引用,
* 所以为了避免内存泄漏,这个Context对象强烈建议使用应用的Application对象。
* @param
* loader GT输入输出参数的注册器,需使用者自行实现,如何实现请参考上面示例
* @return 只有GT未安装会返回false
*/
public static boolean connect(Context hostContext, AbsGTParaLoader loader) {
if (!ENABLE)
{
return false;
}
return GTInternal.INSTANCE.connect(hostContext, loader);
}
/**
* 连接到GT控制台应用,不注册任何的出参和入参
* @param hostContext
* @return
*/
public static boolean connect(Context hostContext) {
if (!ENABLE)
{
return false;
}
return GTInternal.INSTANCE.connect(hostContext, new AbsGTParaLoader() {
@Override
public void loadInParas(InParaManager im) {
}
@Override
public void loadOutParas(OutParaManager om) {
}
});
}
/**
* 与GT应用断连。建议在退出应用时调用。
*
* @param hostContext
* hostContext 被测应用的Context
*/
public static void disconnect(Context hostContext) {
if (!ENABLE)
{
return;
}
GTInternal.INSTANCE.disconnect(hostContext);
}
/**
* 设置耗时统计开关状态,主要用于耗时统计开关随GT启动开启的设置
* 该方法在connect方法之后调用,即可保证GT控制台启动时即开启耗时统计开关
* @param flag 耗时统计开关是否开启
* @since 1.1
*/
public static void setProfilerEnable(boolean flag)
{
if (!ENABLE)
{
return;
}
GTInternal.INSTANCE.setProfilerEnable(flag);
}
/**
* 控制GT控制台开打或关闭悬浮框窗口的命令方法
* @param flag
* @since 1.1
*/
public static void setFloatViewFront(boolean flag)
{
if (!ENABLE)
{
return;
}
GTInternal.INSTANCE.setFloatViewFront(flag);
}
/**
* 向GT控制台的插件发出命令,驱动GT的插件做事情。主要插件要设置为能接收并解析SDK发出的命令。
* @param receiver 插件标识
* @param bundle 封装了命令数据
* @since 1.1
*/
public static void setCommand(String receiver, Bundle bundle)
{
if (!ENABLE)
{
return;
}
GTInternal.INSTANCE.setCommand(receiver, bundle);
}
//=======================================关于输出参数===========================
/**
* 设置输出参数的值,更新的输出参数值会在GT的输出参数界面显示(若该参数被放到了悬浮窗中,则悬浮窗中也会显示)。<P>
* 注意使用该方法前,对应ParaName的参数要先在connect方法中注册。
* 具体请参考demo与使用说明。
*
* @param paraName
* 输出参数的名称
* @param value
* 输出参数的值,支持任意类型,显示时都会被作为字符串处理
* @param extras
* 扩展参数,如果extras[0]是boolean型,则标明该参数是否是Global类型的
*/
public static void setOutPara(String paraName, Object value, Object...extras){
if (!ENABLE)
{
return;
}
if(null != value){
if (null != extras && extras.length > 0)
{
if (extras[0] instanceof Boolean)
{
boolean isGlobal = Boolean.TRUE.equals(extras[0]);
GTInternal.INSTANCE.setOutPara(paraName, value.toString(), isGlobal);
}
}
else
{
GTInternal.INSTANCE.setOutPara(paraName, value.toString(), false);
}
}
}
/**
* 同名方法的无扩展参数版,主要是为了规避java5编译器,无法正确处理Object...extras这种参数的bug
* java6编译器不需要此方法
*/
public static void setOutPara(String paraName, Object value){
if (!ENABLE)
{
return;
}
if(null != value){
GTInternal.INSTANCE.setOutPara(paraName, value.toString(), false);
}
}
//=======================================关于输入参数===========================
/**
* 设置输入参数的值,更新的输入参数值会在GT的输入参数界面显示(若该参数被放到了悬浮窗中,则悬浮窗中也会显示)。<P>
* 注意使用该方法前,对应paraName的参数要先在connect方法中加载。
* <p>
* (*)该方法不常用。
*
* @param paraName
* 输入参数的名称
* @param newValue
* 输入参数的值,支持任意类型,内部会被转成字符串处理
* @param inlog
* 是否要在控制台打印
* @deprecated 该方法不能保证时序性,测试逻辑也不应改变原有被测逻辑的时序
*
* @since 2.1 去掉是否在控制台打印日志的参数,因为以前版本中该参数的tag不好确定,沦为无用的鸡肋了
*/
public static void setInPara(String paraName, Object newValue, Object...extras) {
if (!ENABLE)
{
return;
}
if(null != newValue){
if (null != extras && extras.length > 0)
{
if (extras[0] instanceof Boolean)
{
boolean isGlobal = Boolean.TRUE.equals(extras[0]);
GTInternal.INSTANCE.setInPara(paraName, newValue.toString(), isGlobal);
}
}
else
{
GTInternal.INSTANCE.setInPara(paraName, newValue.toString(), false);
}
}
}
/**
* 设置输入参数的值,更新的输入参数值会在GT的输入参数界面显示(若该参数被放到了悬浮窗中,则悬浮窗中也会显示)。<P>
* 注意使用该方法前,对应paraName的参数要先在connect方法中加载。
* <p>
* (*)该方法不常用。
*
* @param paraName
* 输入参数的名称
* @param newValue
* 输入参数的值,支持任意类型,内部会被转成字符串处理
* @deprecated 该方法不能保证时序性,测试逻辑也不应改变原有被测逻辑的时序
*/
public static void setInPara(String paraName, Object newValue) {
if (!ENABLE)
{
return;
}
if(null != newValue){
// 入参目前不支持注册成全局的,只会在一个APP内有效
GTInternal.INSTANCE.setInPara(paraName, newValue.toString(), false);
}
}
/**
* 获取GT中存储的该输入参数的值,输入参数类型是String的接口。
* <P>
* 对应paraName的参数要先在connect方法中加载。如果对应paraName的参数未在connect方法中加载,
* 或GT控制台未安装,或未正常启动,则直接返回origVal。
*
* @param paraName
* 输入参数的名称
* @param origVal
* 此处建议使用原被测代码中的对应变量的原始值
*
* @return 该入参的当前值
*/
public static String getInPara(String paraName, String origVal){
if (!ENABLE)
{
return "";
}
if(null != paraName && null != origVal){
// 入参目前不支持注册成全局的,只会在一个APP内有效
return GTInternal.INSTANCE.getInPara(paraName, origVal, false);
}
return "";
}
/**
* 获取GT中存储的该输入参数的值,输入参数类型是boolean的接口。
* <P>
* 对应paraName的参数要先在connect方法中加载。如果对应paraName的参数未在connect方法中加载,
* 或GT控制台未安装,或未正常启动,则直接返回origVal。
*
* @param paraName
* 输入参数的名称
* @param origVal
* 此处建议使用原被测代码中的对应变量的原始值
*
* @return 该入参的当前值
*/
public static boolean getInPara(String paraName, boolean origVal){
if (!ENABLE)
{
return origVal;
}
return GTInternal.INSTANCE.getInPara(paraName, origVal, false);
}
/**
* 获取GT中存储的该输入参数的值,输入参数类型是int的接口。
* <P>
* 对应paraName的参数要先在connect方法中加载。如果对应paraName的参数未在connect方法中加载,
* 或GT控制台未安装,或未正常启动,则直接返回origVal。
*
* @param paraName
* 输入参数的名称
* @param origVal
* 此处建议使用原被测代码中的对应变量的原始值
*
* @return 该入参的当前值
*/
public static int getInPara(String paraName, int origVal){
if (!ENABLE)
{
return origVal;
}
return GTInternal.INSTANCE.getInPara(paraName, origVal, false);
}
/**
* 获取GT中存储的该输入参数的值,输入参数类型是double的接口。
* <P>
* 对应paraName的参数要先在connect方法中加载。如果对应paraName的参数未在connect方法中加载,
* 或GT控制台未安装,或未正常启动,则直接返回origVal。
*
* @param paraName
* 输入参数的名称
* @param origVal
* 此处建议使用原被测代码中的对应变量的原始值
*
* @return 该入参的当前值
*/
public static double getInPara(String paraName, double origVal){
if (!ENABLE)
{
return origVal;
}
return GTInternal.INSTANCE.getInPara(paraName, origVal, false);
}
/**
* 获取GT中存储的该输入参数的值,输入参数类型是float的接口。
* <P>
* 对应paraName的参数要先在connect方法中加载。如果对应paraName的参数未在connect方法中加载,
* 或GT控制台未安装,或未正常启动,则直接返回origVal。
*
* @param paraName
* 输入参数的名称
* @param origVal
* 此处建议使用原被测代码中的对应变量的原始值
*
* @return 该入参的当前值
*/
public static float getInPara(String paraName, float origVal){
if (!ENABLE)
{
return origVal;
}
return GTInternal.INSTANCE.getInPara(paraName, origVal, false);
}
/**
* 获取GT中存储的该输入参数的值,输入参数类型是long的接口。
* <P>
* 对应paraName的参数要先在connect方法中加载。如果对应paraName的参数未在connect方法中加载,
* 或GT控制台未安装,或未正常启动,则直接返回origVal。
*
* @param paraName
* 输入参数的名称
* @param origVal
* 此处建议使用原被测代码中的对应变量的原始值
*
* @return 该入参的当前值
*/
public static long getInPara(String paraName, long origVal){
if (!ENABLE)
{
return origVal;
}
return GTInternal.INSTANCE.getInPara(paraName, origVal, false);
}
/**
* 获取GT中存储的该输入参数的值,输入参数类型是short的接口。
* <P>
* 对应paraName的参数要先在connect方法中加载。如果对应paraName的参数未在connect方法中加载,
* 或GT控制台未安装,或未正常启动,则直接返回origVal。
*
* @param paraName
* 输入参数的名称
* @param origVal
* 此处建议使用原被测代码中的对应变量的原始值
*
* @return 该入参的当前值
*/
public static short getInPara(String paraName, short origVal){
if (!ENABLE)
{
return origVal;
}
return GTInternal.INSTANCE.getInPara(paraName, origVal, false);
}
/**
* 获取GT中存储的该输入参数的值,输入参数类型是byte的接口。
* <P>
* 对应paraName的参数要先在connect方法中加载。如果对应paraName的参数未在connect方法中加载,
* 或GT控制台未安装,或未正常启动,则直接返回origVal。
*
* @param paraName
* 输入参数的名称
* @param origVal
* 此处建议使用原被测代码中的对应变量的原始值
*
* @return 该入参的当前值
*/
public static byte getInPara(String paraName, byte origVal){
if (!ENABLE)
{
return origVal;
}
return GTInternal.INSTANCE.getInPara(paraName, origVal, false);
}
/**
* 获取GT中存储的该输入参数的值,输入参数类型是char的接口。
* <P>
* 对应paraName的参数要先在connect方法中加载。如果对应paraName的参数未在connect方法中加载,
* 或GT控制台未安装,或未正常启动,则直接返回origVal。
*
* @param paraName
* 输入参数的名称
* @param origVal
* 此处建议使用原被测代码中的对应变量的原始值
*
* @return 该入参的当前值
*/
public static char getInPara(String paraName, char origVal){
if (!ENABLE)
{
return origVal;
}
return GTInternal.INSTANCE.getInPara(paraName, origVal, false);
}
/**
* 打印日志,INFO级别。
* 被打印的日志会在GT控制台的日志界面显示。
*
* @param tag
* 日志标签
* @param msg
* 日志内容
*/
public static void logI(String tag, String msg) {
if (!ENABLE)
{
return;
}
GTInternal.INSTANCE.logI(tag, msg);
}
/**
* 打印日志,DEBUG级别。
* 被打印的日志会在GT控制台的日志界面显示。
*
* @param tag
* 日志标签
* @param msg
* 日志内容
*/
public static void logD(String tag, String msg) {
if (!ENABLE)
{
return;
}
GTInternal.INSTANCE.logD(tag, msg);
}
/**
* 打印日志,WARNING级别。
* 被打印的日志会在GT控制台的日志界面显示。
*
* @param tag
* 日志标签
* @param msg
* 日志内容
*/
public static void logW( String tag, String msg) {
if (!ENABLE)
{
return;
}
GTInternal.INSTANCE.logW(tag, msg);
}
/**
* 打印日志,ERROR级别。
* 被打印的日志会在GT控制台的日志界面显示。
*
* @param tag
* 日志标签
* @param msg
* 日志内容
*/
public static void logE(String tag, String msg) {
if (!ENABLE)
{
return;
}
GTInternal.INSTANCE.logE(tag, msg);
}
/**
* 开始一次线程内耗时的统计。(要保证与endTimeInThread成对出现)。<P>
* 需要注意,如在递归体中使用,请联系GT开发咨询使用方法。
*
* @param group 统计分组
* @param tag 统计标签
* @param exkeys 额外的扩展匹配键数组,特殊用途
*/
public static void startTimeInThread(String group, String tag, int...exkeys)
{
if (!ENABLE)
{
return;
}
GTInternal.INSTANCE.startTimeInThread(group, tag, exkeys);
}
/**
* 结束一次线程内耗时的统计。
* @param group 统计分组
* @param tag 统计标签
* @param exkeys 额外的扩展匹配键数组,特殊用途
* @return 本次统计的差值,数值精度是纳秒。
*/
public static long endTimeInThread(String group, String tag, int...exkeys)
{
if (!ENABLE)
{
return -1;
}
return GTInternal.INSTANCE.endTimeInThread(group, tag, exkeys);
}
/**
* 开始一次进程内可跨线程的耗时统计(要保证与endTime成对出现)。
* <P>
* 需要注意,如在递归体中使用,请联系GT开发咨询使用方法。
*
* @param group 统计分组
* @param tag 统计标签
* @param exkeys 额外的扩展匹配键数组,特殊用途
*/
public static void startTime(String group, String tag, int...exkeys)
{
if (!ENABLE)
{
return;
}
GTInternal.INSTANCE.startTime(group, tag, exkeys);
}
/**
* 结束一次进程内可跨线程耗时统计(结束计时)。
* @param group 统计分组
* @param tag 统计标签
* @param exkeys 额外的扩展匹配键数组,特殊用途
* @return 本次统计的差值,数值精度是纳秒。
*/
public static long endTime(String group, String tag, int...exkeys)
{
if (!ENABLE)
{
return -1;
}
return GTInternal.INSTANCE.endTime(group, tag, exkeys);
}
/**
* 开始一次可跨进程的耗时统计(要保证与endTimeGlobal成对出现)。
*
* @param group 统计分组
* @param tag 统计标签
* @param exkeys 额外的扩展匹配键数组,特殊用途
* @since 1.1
*/
public static void startTimeGlobal(String group, String tag, int...exkeys)
{
if (!ENABLE)
{
return;
}
GTInternal.INSTANCE.startTimeGlobal(group, tag, exkeys);
}
/**
* 结束一次可跨进程耗时统计(结束计时)。
* @param group 统计分组
* @param tag 统计标签
* @param exkeys 额外的扩展匹配键数组,特殊用途
* @since 1.1
*/
public static void endTimeGlobal(String group, String tag, int...exkeys)
{
if (!ENABLE)
{
return;
}
GTInternal.INSTANCE.endTimeGlobal(group, tag, exkeys);
}
/**
* @deprecated
* @return 连接的GT控制台版本,如未成功连接到控制台,会返回null
*/
public static String getGTConsoleVersion()
{
if (!ENABLE)
{
return null;
}
return GTInternal.INSTANCE.getGTConsoleVersion();
}
/**
* 设置当前的GT连接监听对象
* @param listener
* @since 1.2
*/
public static void setGTConnectedListener(GTConnectListener listener)
{
if (!ENABLE)
{
return;
}
GTInternal.INSTANCE.setGTConnectListener(listener);
}
}