package com.duolebo.blyrobot.data import android.content.Context import android.util.Log import com.duolebo.blyrobot.util.AdbUtil 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 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 val dir = File(this.imagePath) if (!dir.exists()) dir.mkdirs() } fun start() { this.launchApp() stop() } fun stop() { AdbUtil.stopApp(this.packageName) this.taskListener?.run { onComplete() } } fun launchApp(reset: Boolean = true) { if (reset) { AdbUtil.resetApp(this.packageName) } 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 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()) val imagePath = this.imagePath + "/${packageName}_$time.png" AdbUtil.screenShot(imagePath) } 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() } }