diff --git a/app/build.gradle b/app/build.gradle index ec3970f5f4d398c93a4dd73f0babde22f332a60d..d773b63db3db8b25a82ba8cd252032a0f8aeab30 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,7 +9,7 @@ android { minSdkVersion 15 targetSdkVersion 22 versionCode 1 - versionName "1.0" + versionName "1.1" } signingConfigs { diff --git a/app/src/main/assets/test.json b/app/src/main/assets/test.json index 696283517cf89338298c416527a032721babf557..b184e5382145bd63c9e59bf4578c293d25d01352 100644 --- a/app/src/main/assets/test.json +++ b/app/src/main/assets/test.json @@ -1,5 +1,5 @@ { - "name": "电视家", + "name": "电视家2.0", "packageName": "com.elinkway.tvlive2", "launcher": "com.elinkway.tvlive2.activity.SplashActivity", "launchDelay": "15", diff --git a/app/src/main/java/com/duolebo/blyrobot/MainActivity.kt b/app/src/main/java/com/duolebo/blyrobot/MainActivity.kt index 81cceafda3da3ac31ea11bdc0760ebdfa08eb0b9..6020e5e1c46a4561c6bc3f4522ebc518cefb2170 100644 --- a/app/src/main/java/com/duolebo/blyrobot/MainActivity.kt +++ b/app/src/main/java/com/duolebo/blyrobot/MainActivity.kt @@ -1,6 +1,7 @@ package com.duolebo.blyrobot import android.content.Intent +import android.graphics.drawable.Drawable import android.os.Bundle import android.support.v4.content.LocalBroadcastManager import android.support.v7.app.AppCompatActivity @@ -12,7 +13,9 @@ import android.widget.Toast import com.duolebo.appbase.AppBaseHandler import com.duolebo.appbase.IAppBaseCallback import com.duolebo.appbase.IProtocol +import com.duolebo.blyrobot.activity.PackageListActivity import com.duolebo.blyrobot.data.ApkInfo +import com.duolebo.blyrobot.data.ApkPackageInfo import com.duolebo.blyrobot.data.AppInfoData import com.duolebo.blyrobot.data.Task import com.duolebo.blyrobot.protocol.GetAppInfoProtocol @@ -22,6 +25,7 @@ import com.duolebo.blyrobot.ui.AppConfigListItem import com.duolebo.blyrobot.util.AdbUtil import com.duolebo.blyrobot.util.Config import com.duolebo.blyrobot.util.Constants +import com.minhui.vpn.utils.ThreadProxy import kotlinx.android.synthetic.main.activity_main.* import java.util.* @@ -33,13 +37,14 @@ class MainActivity : AppCompatActivity(), IAppBaseCallback { private lateinit var appInfoAdapter: AppConfigAdapter private lateinit var refreshTimer: Timer + private var apkPackageInfo: List? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Log.i(TAG, "onCreate....") setContentView(R.layout.activity_main) - apkInfoProtocol = GetAppInfoProtocol(this, Config.instance) - this.dataHandler = AppBaseHandler(this) + getLocalAppList() this.appInfoAdapter = AppConfigAdapter() listView.adapter = this.appInfoAdapter @@ -65,6 +70,22 @@ class MainActivity : AppCompatActivity(), IAppBaseCallback { stopRobot() } startBtn.requestFocus() + + requestAppList() + } + + private fun requestAppList() { + apkInfoProtocol = GetAppInfoProtocol(this, Config.instance) + this.dataHandler = AppBaseHandler(this) + apkInfoProtocol.execute(this.dataHandler) + } + + private fun getLocalAppList() { + ThreadProxy.getInstance().execute(object : Runnable { + override fun run() { + apkPackageInfo = ApkPackageInfo.getAppInfos(applicationContext) + } + }) } private fun initRefreshTimer() { @@ -122,6 +143,21 @@ class MainActivity : AppCompatActivity(), IAppBaseCallback { } } + private fun getAppIcon(packageName: String): Drawable? { + var drawable:Drawable ?= null + apkPackageInfo?.run { + val targetPackage = this.find { + it.packageName == packageName + } + + if (targetPackage != null) { + drawable = targetPackage.applicationInfo.loadIcon(packageManager) + } + } + + return drawable + } + class AppConfigAdapter: BaseAdapter() { private val dataList = ArrayList() @@ -132,10 +168,12 @@ class MainActivity : AppCompatActivity(), IAppBaseCallback { } override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { - var itemView = convertView as AppConfigListItem + var itemView: AppConfigListItem if (convertView == null) { itemView = AppConfigListItem(parent.context) } + else + itemView = convertView as AppConfigListItem itemView.setData(dataList[position]) diff --git a/app/src/main/java/com/duolebo/blyrobot/data/AppInfoData.kt b/app/src/main/java/com/duolebo/blyrobot/data/AppInfoData.kt index e935df4f8a1d4cb749bf724fcfd1845f8494cc21..36ed6f913a81f30fc1af00d04e3cd150443a09d1 100644 --- a/app/src/main/java/com/duolebo/blyrobot/data/AppInfoData.kt +++ b/app/src/main/java/com/duolebo/blyrobot/data/AppInfoData.kt @@ -1,22 +1,25 @@ package com.duolebo.blyrobot.data -import com.duolebo.appbase.IModel import com.duolebo.appbase.prj.XMLHelper +import com.duolebo.appbase.prj.bmtv.model.ModelBase import org.json.JSONArray import org.json.JSONObject -class AppInfoData : IModel { +class AppInfoData : ModelBase() { val apkInfos = ArrayList() + var result = -1 override fun from(json: JSONObject): Boolean { val data = json.optJSONArray("data") if (data != null) { - for (i in 0..data.length()) { + for (i in 0 until data.length()) { val apkInfo = ApkInfo() apkInfo.from(data.getJSONObject(i)) apkInfos.add(apkInfo) } } + result = 0 + return true } @@ -27,4 +30,8 @@ class AppInfoData : IModel { override fun from(p0: XMLHelper?): Boolean { return false } + + override fun getCode(): Int { + return result + } } \ No newline at end of file diff --git a/app/src/main/java/com/duolebo/blyrobot/data/Task.kt b/app/src/main/java/com/duolebo/blyrobot/data/Task.kt index 301419711ca9056f63a2c9bc4af6e0860bcb0827..55371cabbacde8cca06be23d2e0dd06baf5c13c3 100644 --- a/app/src/main/java/com/duolebo/blyrobot/data/Task.kt +++ b/app/src/main/java/com/duolebo/blyrobot/data/Task.kt @@ -3,6 +3,7 @@ package com.duolebo.blyrobot.data import android.content.Context import android.os.Environment import android.util.Log +import android.widget.Toast import com.duolebo.appbase.AppBaseHandler import com.duolebo.appbase.IAppBaseCallback import com.duolebo.appbase.IProtocol @@ -10,10 +11,7 @@ import com.duolebo.blyrobot.protocol.ApkReportProtocol import com.duolebo.blyrobot.util.AdbUtil import com.duolebo.blyrobot.util.AppUtil import com.duolebo.blyrobot.util.Config -import net.gotev.uploadservice.ServerResponse -import net.gotev.uploadservice.UploadInfo -import net.gotev.uploadservice.UploadNotificationConfig -import net.gotev.uploadservice.UploadStatusDelegate +import net.gotev.uploadservice.* import net.gotev.uploadservice.ftp.FTPUploadRequest import net.gotev.uploadservice.ftp.UnixPermissions import org.json.JSONObject @@ -43,10 +41,12 @@ class Task : IAppBaseCallback { .getExternalStorageDirectory().absolutePath + "/capture.txt" private var uploadImages = ArrayList() + private var uploadId = "" private var channelIndex = 0 private var status = "0" + private var reportProtocol: ApkReportProtocol private var dataHandler:AppBaseHandler private lateinit var reportJson: JSONObject @@ -91,6 +91,18 @@ class Task : IAppBaseCallback { AdbUtil.stopApp(this.apkInfo.packageName) } + fun destroy() { + // 杀掉tcpdump进程 + AdbUtil.killTcpdump() + + // 退出应用 + AdbUtil.stopApp(this.apkInfo.packageName) + + // 取消ftp上传 + if (!uploadId.isNullOrEmpty()) + UploadService.stopUpload(uploadId) + } + private fun finish(result: Boolean) { this.taskListener?.run { onComplete(result) @@ -290,7 +302,7 @@ class Task : IAppBaseCallback { } } - val uploadId = uploadRequest.startUpload() + this.uploadId = uploadRequest.startUpload() Log.i(TAG, "upload id $uploadId") } catch (exc: Exception) { Log.e(TAG, exc.message, exc) diff --git a/app/src/main/java/com/duolebo/blyrobot/protocol/GetAppInfoProtocol.kt b/app/src/main/java/com/duolebo/blyrobot/protocol/GetAppInfoProtocol.kt index 2b47b3fe060b9882f4ec52efb1ac854645575165..3cb2abd583bb7ea19d6a9e47db6bf010ddfcbe5d 100644 --- a/app/src/main/java/com/duolebo/blyrobot/protocol/GetAppInfoProtocol.kt +++ b/app/src/main/java/com/duolebo/blyrobot/protocol/GetAppInfoProtocol.kt @@ -2,6 +2,7 @@ package com.duolebo.blyrobot.protocol import android.content.Context import com.duolebo.appbase.IModel +import com.duolebo.appbase.net.Parser import com.duolebo.appbase.prj.bmtv.protocol.IProtocolConfig import com.duolebo.appbase.prj.bmtv.protocol.ProtocolBase import com.duolebo.blyrobot.data.AppInfoData @@ -10,6 +11,10 @@ class GetAppInfoProtocol(context: Context?, config: IProtocolConfig?) : Protocol val model = AppInfoData() + override fun prepareHttpBody(): ByteArray { + return "".toByteArray() + } + override fun prepareProtocolBody(p0: MutableMap?) { } @@ -21,4 +26,7 @@ class GetAppInfoProtocol(context: Context?, config: IProtocolConfig?) : Protocol return "" } + override fun requestHttpMethod(): Parser.ParserClient.HttpMethod { + return Parser.ParserClient.HttpMethod.GET + } } \ No newline at end of file diff --git a/app/src/main/java/com/duolebo/blyrobot/service/BylRobotService.kt b/app/src/main/java/com/duolebo/blyrobot/service/BylRobotService.kt index 3e05dc50ac13c9366a3de91079bf076429b1faca..8f923f3b3027572ad6c3e5104dec7d27bc349c85 100644 --- a/app/src/main/java/com/duolebo/blyrobot/service/BylRobotService.kt +++ b/app/src/main/java/com/duolebo/blyrobot/service/BylRobotService.kt @@ -33,7 +33,6 @@ class BylRobotService: Service() { Constants.CMD_START -> loadTask() Constants.CMD_STOP -> stopTask() } - loadTask() } } } @@ -78,12 +77,6 @@ class BylRobotService: Service() { TaskManager.instance.stop() } - private fun screenShot() { - Thread(Runnable { - - }).start() - } - private fun testKey() { Thread(Runnable { AdbUtil.sendMultiKey("down/up/right") diff --git a/app/src/main/java/com/duolebo/blyrobot/tools/TaskManager.kt b/app/src/main/java/com/duolebo/blyrobot/tools/TaskManager.kt index 5d531be71cb4f6f823cba216734c18f74c080607..b0da779ff322c8951ef2759b62ae6b3e4ed0e5bf 100644 --- a/app/src/main/java/com/duolebo/blyrobot/tools/TaskManager.kt +++ b/app/src/main/java/com/duolebo/blyrobot/tools/TaskManager.kt @@ -9,9 +9,13 @@ class TaskManager { val tasks = ArrayList() private var isRunning = false private var currentTask: Task ?= null + // 处理时间 + var updateTime = 0L private val runnable = Runnable { - while (isRunning && tasks.size > 0) { + val dist = System.currentTimeMillis() - updateTime + while (isRunning && tasks.size > 0 && dist > 6*60*60*1000) { + this.updateTime = System.currentTimeMillis() currentTask = tasks[0] currentTask!!.start() } @@ -20,7 +24,7 @@ class TaskManager { fun add(task: Task) { task.taskListener = object : Task.OnTaskListener { override fun onComplete(result: Boolean) { - remove(task) + Log.i(TAG, "task ${task.apkInfo.name} complete with result: $result") } } this.tasks.add(task) @@ -55,9 +59,12 @@ class TaskManager { } fun stop() { + updateTime = 0L this.tasks.forEach { - + it.destroy() } + + this.tasks.clear() this.isRunning = false } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 23ea9c5f8da11e57e958adc4269110a9c165a991..512ef07db8801106691a4b624a2aecb91b02c6fc 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -5,11 +5,20 @@ android:layout_height="match_parent" android:layout_width="match_parent"> + +