package com.duolebo.blyrobot.data import android.content.Context import android.util.Log import com.duolebo.blyrobot.util.AdbUtil import com.duolebo.blyrobot.util.AppUtil import com.duolebo.blyrobot.util.Constants import org.json.JSONObject import net.gotev.uploadservice.UploadNotificationConfig import net.gotev.uploadservice.ftp.FTPUploadRequest import org.json.JSONArray import java.io.File import java.text.SimpleDateFormat import java.util.* class Task { lateinit var packageName: String private lateinit var launcher: String private lateinit var imagePath: String private var launchDelay = 15 private lateinit var keyEvent: String private var context: Context private val imageDateFormat = SimpleDateFormat("yyyy_MM_dd_HH_mm_ss", Locale.CHINA) var proc: Process? = null constructor(context: Context) { this.context = context } fun from(json: JSONObject) { this.packageName = json.optString(Constants.PACKAGE_NAME) this.launcher = json.optString(Constants.LAUNCHER) this.launchDelay = json.optInt(Constants.LAUNCH_DELAY, 15) this.imagePath = this.context.cacheDir.absolutePath + "/" + this.packageName this.keyEvent = json.optString(Constants.KEY_EVENT) val dir = File(this.imagePath) if (!dir.exists()) dir.mkdirs() } fun start() { this.launchApp() this.capture() this.uploadImage() this.report() stop() } fun stop() { AdbUtil.stopApp(this.packageName) this.taskListener?.run { onComplete() } } fun launchApp(reset: Boolean = false) { if (reset) { try { AdbUtil.resetApp(this.packageName) } catch (e: java.lang.Exception) { e.printStackTrace() } } AdbUtil.launchApp("$packageName/$launcher") Thread.sleep(launchDelay * 1000L) } private fun capture() { proc?.destroy() Thread(Runnable { AdbUtil.killTcpdump() }).start() Thread.sleep(3000) Thread(Runnable { proc = AdbUtil.tcpCapture("") }).start() } private fun report() { } private fun parseCaptureFile(filterUrl: String) { val file = File("/sdcard/capture.txt") val lines = file.readLines() val playUrlItems = JSONArray() var partUrl = "" var timeStr = "" val tagGet = "GET /" lines.forEach { if (it.contains("IP (")) { val end = it.indexOf('.') timeStr = it.substring(0, end) } if (it.contains(tagGet)) { val start = it.indexOf(tagGet) + tagGet.length - 1 val end = it.lastIndexOf(' ') partUrl = it.substring(start, end) } if (it.contains("Host")) { val start = it.indexOf(' ') + 1 val host = it.substring(start) val url = "http://$host$partUrl" val item = JSONObject() item.put(Constants.KEY_URL, url) item.put(Constants.KEY_TIME, timeStr) playUrlItems.put(item) partUrl = "" } } for (i in 0..playUrlItems.length()) { val jo = playUrlItems.get(i) as JSONObject val url = jo.optString(Constants.KEY_URL) } } fun screenShot() { val time = imageDateFormat.format(Date()) var pngPath = this.imagePath + "/${packageName}_$time.png" val jpgPath = pngPath.replace(".png", ".jpg") AdbUtil.screenShot(pngPath) AppUtil.pngToJpg(pngPath, jpgPath) } fun uploadImage() { try { val uploadRequest = FTPUploadRequest(context, "ftp.duolebo.com", 21) .setUsernameAndPassword("user", "password") .setNotificationConfig(UploadNotificationConfig()) .setMaxRetries(4) var dir = File(imagePath) dir.listFiles().forEach { uploadRequest.addFileToUpload(it.absolutePath, "/remote/path") } val uploadId = uploadRequest.startUpload() } catch (exc: Exception) { Log.e("AndroidUploadService", exc.message, exc) } } var taskListener: OnTaskListener? = null interface OnTaskListener { fun onComplete() } }