package org.shikato.infodumper; import android.content.Context; import com.facebook.stetho.dumpapp.ArgsHelper; import com.facebook.stetho.dumpapp.DumpException; import com.facebook.stetho.dumpapp.DumpUsageException; import com.facebook.stetho.dumpapp.DumperContext; import com.facebook.stetho.dumpapp.DumperPlugin; import org.shikato.infodumper.dump.ApplicationInfoDumper; import org.shikato.infodumper.dump.BuildConfigDumper; import org.shikato.infodumper.dump.DpiDumper; import org.shikato.infodumper.dump.ErrorDumper; import org.shikato.infodumper.dump.IdsDumper; import org.shikato.infodumper.dump.InfoDumper; import org.shikato.infodumper.dump.LastUpdateDumper; import org.shikato.infodumper.dump.MemoryDumper; import org.shikato.infodumper.dump.NetworkDumper; import org.shikato.infodumper.dump.OsBuildDumper; import org.shikato.infodumper.dump.PermissionDumper; import org.shikato.infodumper.dump.TelDumper; import java.io.PrintStream; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class InfoDumperPlugin implements DumperPlugin { private static final String NAME = "info"; private static final String CMD_ALL = "all"; private static final String CMD_BUILD_CONFIG = "buildconf"; private static final String CMD_ID = "id"; private static final String CMD_DPI = "dpi"; private static final String CMD_MEMORY = "memory"; private static final String CMD_NETWORK = "network"; private static final String CMD_ERROR = "error"; private static final String CMD_TEL = "tel"; private static final String CMD_PERMISSION = "permission"; private static final String CMD_LAST_UPDATE = "lastupdate"; private static final String CMD_APPLICATION_INFO = "appinfo"; private static final String CMD_OS_BUILD = "osbuild"; private Context mContext = null; private boolean mIsAll = false; public InfoDumperPlugin(Context context) { mContext = context.getApplicationContext(); } // getNameで返す値がdumpappp実行時のコマンドとなる // ex.) appdump {{NAME}} @Override public String getName() { return NAME; } // getNameで指定したコマンドを実行したときに呼ばれる @Override public void dump(DumperContext dumperContext) throws DumpException { Iterator<String> argsIterator = dumperContext.getArgsAsList().iterator(); String command = ArgsHelper.nextOptionalArg(argsIterator, null); mIsAll = false; if (CMD_BUILD_CONFIG.equalsIgnoreCase(command)) { dumpBuildConfig(dumperContext); } else if (CMD_PERMISSION.equalsIgnoreCase(command)) { dumpPermission(dumperContext); } else if (CMD_LAST_UPDATE.equalsIgnoreCase(command)) { dumpLastUpdate(dumperContext); } else if (CMD_APPLICATION_INFO.equalsIgnoreCase(command)) { dumpApplicationInfo(dumperContext); } else if (CMD_ID.equalsIgnoreCase(command)) { dumpIds(dumperContext); } else if (CMD_OS_BUILD.equalsIgnoreCase(command)) { dumpOsBuild(dumperContext); } else if (CMD_DPI.equalsIgnoreCase(command)) { dumpDpi(dumperContext); } else if (CMD_MEMORY.equalsIgnoreCase(command)) { dumpMemory(dumperContext); } else if (CMD_ERROR.equalsIgnoreCase(command)) { dumpError(dumperContext); } else if (CMD_NETWORK.equalsIgnoreCase(command)) { dumpNetwork(dumperContext); } else if (CMD_TEL.equalsIgnoreCase(command)) { dumpTel(dumperContext); } else if (CMD_ALL.equalsIgnoreCase(command)) { mIsAll = true; dumpBuildConfig(dumperContext); dumpPermission(dumperContext); dumpLastUpdate(dumperContext); dumpApplicationInfo(dumperContext); dumpIds(dumperContext); dumpOsBuild(dumperContext); dumpDpi(dumperContext); dumpMemory(dumperContext); dumpError(dumperContext); dumpNetwork(dumperContext); dumpTel(dumperContext); } else { usage(dumperContext); if (command != null) { throw new DumpUsageException("Unknown command: " + command); } } } private void dumpBuildConfig(DumperContext dumperContext) throws DumpException { dumpTypeMap(dumperContext, new BuildConfigDumper()); } private void dumpPermission(DumperContext dumperContext) throws DumpException { dumpTypeList(dumperContext, new PermissionDumper()); } private void dumpLastUpdate(DumperContext dumperContext) throws DumpException { dumpTypeList(dumperContext, new LastUpdateDumper()); } private void dumpApplicationInfo(DumperContext dumperContext) throws DumpException { dumpTypeMap(dumperContext, new ApplicationInfoDumper()); } private void dumpOsBuild(DumperContext dumperContext) throws DumpException { dumpTypeMap(dumperContext, new OsBuildDumper()); } private void dumpIds(DumperContext dumperContext) throws DumpException { dumpTypeMap(dumperContext, new IdsDumper()); } private void dumpDpi(DumperContext dumperContext) throws DumpException { dumpTypeMap(dumperContext, new DpiDumper()); } private void dumpMemory(DumperContext dumperContext) throws DumpException { dumpTypeMap(dumperContext, new MemoryDumper()); } private void dumpError(DumperContext dumperContext) throws DumpException { dumpTypeMap(dumperContext, new ErrorDumper()); } private void dumpNetwork(DumperContext dumperContext) throws DumpException { dumpTypeMap(dumperContext, new NetworkDumper()); } private void dumpTel(DumperContext dumperContext) throws DumpException { dumpTypeMap(dumperContext, new TelDumper()); } private void dumpTypeMap(DumperContext dumperContext, InfoDumper dumper) throws DumpException { PrintStream writer = dumperContext.getStdout(); if (mIsAll) { writer.println("[" + dumper.getTitle() + "]"); } LinkedHashMap<String, String> dumps = dumper.getDumpMap(mContext); if (dumps == null) { writer.println(dumper.getErrorMessage()); if (mIsAll) { writer.println(""); } return; } for (Map.Entry<String, String> e : dumps.entrySet()) { writer.println(e.getKey() + ": " + e.getValue()); } if (mIsAll) { writer.println(""); } } private void dumpTypeList(DumperContext dumperContext, InfoDumper dumper) throws DumpException { PrintStream writer = dumperContext.getStdout(); if (mIsAll) { writer.println("[" + dumper.getTitle() + "]"); } List<String> dumps = dumper.getDumpList(mContext); if (dumps == null) { writer.println(dumper.getErrorMessage()); if (mIsAll) { writer.println(""); } return; } for (String dump : dumps) { writer.println(dump); } if (mIsAll) { writer.println(""); } } private void usage(DumperContext dumperContext) { PrintStream writer = dumperContext.getStdout(); final String cmdName = "dumpapp " + NAME; final String usagePrefix = "Usage: " + cmdName + " "; writer.println(usagePrefix + "<command>"); writer.print(usagePrefix + CMD_BUILD_CONFIG); writer.println(); writer.print(usagePrefix + CMD_ID); writer.println(); writer.print(usagePrefix + CMD_DPI); writer.println(); writer.print(usagePrefix + CMD_MEMORY); writer.println(); writer.print(usagePrefix + CMD_PERMISSION); writer.println(); writer.print(usagePrefix + CMD_LAST_UPDATE); writer.println(); writer.print(usagePrefix + CMD_APPLICATION_INFO); writer.println(); writer.print(usagePrefix + CMD_OS_BUILD); writer.println(); writer.print(usagePrefix + CMD_NETWORK); writer.println(); writer.print(usagePrefix + CMD_ERROR); writer.println(); writer.print(usagePrefix + CMD_TEL); writer.println(); writer.print(usagePrefix + CMD_ALL); writer.println(); } }