Skip to content

Commit

Permalink
Merge branch 'release/3.2.5'
Browse files Browse the repository at this point in the history
  • Loading branch information
sollyu committed Dec 29, 2017
2 parents a369a10 + 79f18b3 commit 23be5e9
Show file tree
Hide file tree
Showing 27 changed files with 1,092 additions and 52 deletions.
19 changes: 15 additions & 4 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ android {

defaultConfig {
applicationId "com.sollyu.xposed.hook.model"
minSdkVersion 15
minSdkVersion 16
targetSdkVersion 26
versionCode 585
versionName "3.2.4." + getGitVersion()
versionCode 586
versionName "3.2.5." + getGitVersion()
}
buildTypes {
release {
Expand All @@ -41,6 +41,13 @@ android {
coolapk {
dimension "default"
}
oschina {
dimension "default"
}
ys168 {
dimension "default"
}

}
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
Expand All @@ -50,7 +57,7 @@ android {
}

dependencies {
compileOnly fileTree(include: ['*.jar'], dir: 'libs')
compileOnly fileTree(include: ['*.jar'], dir: 'libs')
implementation files('libs/umeng-analytics-7.4.0.jar')
implementation files('libs/umeng-common-1.4.0.jar')
implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
Expand Down Expand Up @@ -88,6 +95,10 @@ dependencies {
implementation 'com.github.rubensousa:bottomsheetbuilder:1.6.0'
// https://github.com/NoNews/NoPermission
implementation 'ru.alexbykov:nopermission:1.1.2'
// https://github.com/Justson/AgentWeb
implementation 'com.just.agentweb:agentweb:3.0.0-rc'
// https://github.com/dlazaro66/QRCodeReaderView
implementation 'com.dlazaro66.qrcodereaderview:qrcodereaderview:2.0.3'
}

repositories {
Expand Down
42 changes: 27 additions & 15 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_SUPERUSER" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CAMERA" />

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

<application
android:name=".commons.Application"
Expand All @@ -22,34 +28,39 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme.NoActionBar">
<activity
android:name=".activitys.ActivitySplash"
android:label="@string/app_name"
android:theme="@style/SpeedyBrandTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="de.robv.android.xposed.category.MODULE_SETTINGS" />
</intent-filter>
</activity>

<activity-alias
android:name=".activitys.ActivitySplashAlias"
android:label="@string/app_name"
android:targetActivity=".activitys.ActivitySplash">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
<activity
android:name=".activitys.ActivitySplash"
android:label="@string/app_name"
android:theme="@style/SpeedyBrandTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="de.robv.android.xposed.category.MODULE_SETTINGS" />
</intent-filter>
</activity>
<activity
android:name=".activitys.ActivityMain"/>
<activity
android:name=".activitys.ActivitySettings"/>

<activity android:name=".activitys.ActivityMain" />
<activity android:name=".activitys.ActivitySettings" />
<activity android:name=".activitys.ActivityAbout" />
<activity android:name=".activitys.ActivityWeb" />
<activity android:name=".activitys.ActivityScanQR" />
<activity android:name=".activitys.ActivityLog" />
<activity android:name=".activitys.ActivityRegister"/>
<activity
android:name=".activitys.ActivityDetail"
android:windowSoftInputMode="stateHidden|stateAlwaysHidden" />
<activity
android:name=".activitys.ActivityAbout"/>

<meta-data
android:name="xposedmodule"
Expand All @@ -60,6 +71,7 @@
<meta-data
android:name="xposedminversion"
android:value="2+" />

</application>

</manifest>
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ abstract class ActivityBase : AppCompatActivity() {
onInitView()
onInitData()
onInitListener()
Handler().post { onInitDone() }
activity.runOnUiThread { onInitDone() }
}

open fun onInitView() {}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,32 +8,43 @@

package com.sollyu.android.appenv.activitys

import android.annotation.SuppressLint
import android.app.Activity
import android.app.ProgressDialog.show
import android.content.Intent
import android.content.pm.ApplicationInfo
import android.net.Uri
import android.support.design.widget.Snackbar
import android.telephony.TelephonyManager
import android.util.Base64
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.PopupMenu
import com.afollestad.materialdialogs.MaterialDialog
import com.alibaba.fastjson.JSON
import com.alibaba.fastjson.JSONObject
import com.elvishew.xlog.XLog
import com.github.rubensousa.bottomsheetbuilder.BottomSheetBuilder
import com.just.agentweb.AgentWeb
import com.just.agentweb.AgentWebConfig
import com.sollyu.android.appenv.R
import com.sollyu.android.appenv.bean.PhoneModel
import com.sollyu.android.appenv.commons.*
import com.sollyu.android.appenv.commons.Random
import com.sollyu.android.appenv.define.AppEnvConstants
import com.sollyu.android.appenv.events.EventSample
import com.squareup.okhttp.*
import kotlinx.android.synthetic.main.activity_detail.*
import kotlinx.android.synthetic.main.content_activity_detail.*
import kotlinx.android.synthetic.main.include_toolbar.*
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
import org.xutils.view.annotation.Event
import org.xutils.x
import java.io.IOException
import java.util.*


Expand Down Expand Up @@ -72,6 +83,7 @@ class ActivityDetail : ActivityBase() {
setContentView(R.layout.activity_detail)

x.view().inject(activity)
EventBus.getDefault().register(this)

setSupportActionBar(toolbar)
supportActionBar?.title = appInfo.loadLabel(packageManager)
Expand Down Expand Up @@ -137,6 +149,11 @@ class ActivityDetail : ActivityBase() {
}
}

override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}

override fun getMobclickAgentTag(): String {
return "Detail"
}
Expand All @@ -150,6 +167,7 @@ class ActivityDetail : ActivityBase() {
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.menuDeleteConfig -> { this.onItemClickDeleteConfig() }
R.id.menuUploadConfig -> { this.onItemClickUploadConfig() }
R.id.menuSolutionSave -> { this.onItemClickSolutionSave() }
R.id.menuSolutionLoad -> { this.onItemClickSolutionLoad() }
R.id.menuSolutionDele -> { this.onItemClickSolutionDelete()}
Expand All @@ -158,6 +176,24 @@ class ActivityDetail : ActivityBase() {
return super.onOptionsItemSelected(item)
}

/**
* 收到消息事件
*/
@Suppress("unused")
@Subscribe(threadMode = ThreadMode.MAIN, sticky = false)
fun onEventBus(eventSample: EventSample) {
when (eventSample.eventTYPE) {
EventSample.TYPE.DETAIL_JSON_2_UI -> {
XLog.d(eventSample.value)
if (eventSample.value is JSONObject) {
jsonObjectToUi(eventSample.value as JSONObject)
}
}
else -> {
}
}
}

/**
*
*/
Expand Down Expand Up @@ -474,7 +510,7 @@ class ActivityDetail : ActivityBase() {
if (launchIntent != null) {
startActivity(launchIntent)//null pointer check in case package name was not found
} else {

Snackbar.make(fab, "此程序没有界面,无法启动", Snackbar.LENGTH_LONG).show()
}
} else {
Snackbar.make(view, R.string.detail_run_app, Snackbar.LENGTH_LONG)
Expand Down Expand Up @@ -534,13 +570,65 @@ class ActivityDetail : ActivityBase() {
activity.finish()
}

private fun onItemClickUploadConfig() {
val cookie = AgentWebConfig.getCookiesByUrl(AppEnvConstants.URL_APPENV_SERVER)
if (cookie.isNullOrEmpty()) {
MaterialDialog.Builder(activity).title(R.string.tip).content("没有检测到您登陆").positiveText(android.R.string.ok).show()
return
}

MaterialDialog.Builder(activity)
.title(R.string.tip)
.input("请输入保存方案的名称", "", false) { dialog, input ->
dialog.dismiss()

val uiConfigJsonObject = uiToJsonObject();
uiConfigJsonObject.put("config.name" , input.toString())
uiConfigJsonObject.put("app.package.label", appInfo.loadLabel(activity.packageManager))

val materialDialog = MaterialDialog.Builder(activity).title(R.string.tip).content("正在上传……").progress(true, 0).cancelable(false).show()
val formBody = FormEncodingBuilder().add(Base64.encodeToString(appInfo.packageName.toByteArray(), Base64.NO_WRAP), uiConfigJsonObject.toJSONString()).build()
OkHttpClient().newCall(Request.Builder().url(AppEnvConstants.URL_APPENV_UPLOAD_PACKAGE).header("Cookie", cookie).post(formBody).build()).enqueue(object : Callback {
override fun onFailure(request: Request, e: IOException) {
materialDialog.dismiss()
activity.runOnUiThread { MaterialDialog.Builder(activity).title(R.string.tip).content("上传出现错误:\n" + Log.getStackTraceString(e)).positiveText(android.R.string.ok).show() }
}

override fun onResponse(response: Response) {
materialDialog.dismiss()
try {
val serverResult = response.body().string()
XLog.d(serverResult)
val jsonObject = JSON.parseObject(serverResult)
if (jsonObject.getInteger("ret") == 200) {
activity.runOnUiThread { Snackbar.make(fab, "上传成功", Snackbar.LENGTH_LONG).show() }
} else {
activity.runOnUiThread { MaterialDialog.Builder(activity).title(R.string.tip).content("上传出现错误:\n" + jsonObject.getString("msg")).positiveText(android.R.string.ok).show() }
}
} catch (throwable: Throwable) {
activity.runOnUiThread { MaterialDialog.Builder(activity).title(R.string.tip).content("上传出现错误:\n请确定您已经正确的登陆").positiveText(android.R.string.ok).show() }
}
}
})
}
.show()
}

/**
*
*/
@Event(R.id.menu_scan_qr_code)
private fun onItemClickScanQRCode(view: View) {
ActivityScanQR.launch(activity, ActivityScanQR.FROM_DETAIL)
}

/**
*
*/
private fun onItemClickSolutionSave() {
MaterialDialog.Builder(activity)
.title(R.string.detail_solution_save_title)
.input(R.string.detail_solution_save_hint, R.string.empty, false) { dialog, input ->
.input(R.string.detail_solution_save_hint, R.string.empty, false) { _, input ->
Solution.Instance.set(input.toString(), uiToJsonObject())
Snackbar.make(fab, activity.getString(R.string.detail_solution_save_success, input), Snackbar.LENGTH_LONG).show()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/*
* Copyright © 2017 Sollyu <https://www.sollyu.com/>
*
* Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
*
* This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below.
*/

package com.sollyu.android.appenv.activitys

import android.app.Activity
import android.content.Intent
import android.text.method.ScrollingMovementMethod
import android.view.Menu
import android.view.MenuItem
import com.sollyu.android.appenv.R
import com.sollyu.android.appenv.commons.Application
import kotlinx.android.synthetic.main.activity_log.*
import kotlinx.android.synthetic.main.include_toolbar.*
import org.apache.commons.io.FileUtils
import java.io.File

class ActivityLog : ActivityBase() {
companion object {
fun launch(activity: Activity) {
activity.startActivity(Intent(activity, ActivityLog::class.java))
}
}

override fun getMobclickAgentTag(): String {
return "Log"
}

override fun onInitView() {
super.onInitView()
setContentView(R.layout.activity_log)
setSupportActionBar(toolbar)
supportActionBar?.setTitle(R.string.settings_log)
supportActionBar?.setHomeButtonEnabled(true)
supportActionBar?.setDisplayHomeAsUpEnabled(true)

textView.movementMethod = ScrollingMovementMethod.getInstance()
textView.setHorizontallyScrolling(true)
}

override fun onInitData() {
super.onInitData()
onItemClickReloadLog()
}

override fun onCreateOptionsMenu(menu: Menu): Boolean {
// Inflate the menu; this adds items to the action bar if it is present.
menuInflater.inflate(R.menu.activity_log, menu)
return true
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.menuDeleteLog -> {
this.onItemClickDeleteLog()
}
R.id.menuReloadLog -> {
this.onItemClickReloadLog()
}
}
return super.onOptionsItemSelected(item)
}

private fun onItemClickDeleteLog() {
val logFile = File(Application.Instance.externalCacheDir.absolutePath, "log")
if (logFile.exists()) {
FileUtils.forceDelete(logFile)
}
onItemClickReloadLog()
}

private fun onItemClickReloadLog() {
val logFile = File(Application.Instance.externalCacheDir.absolutePath, "log")
if (logFile.exists() && logFile.canRead()) {
textView.text = FileUtils.readFileToString(logFile, "UTF-8")
} else {
textView.text = ""
}
}
}
Loading

0 comments on commit 23be5e9

Please sign in to comment.