From 10221ea31dcf5fb06697be575e4d1a76edff2291 Mon Sep 17 00:00:00 2001 From: sollyu Date: Wed, 27 Dec 2017 11:16:42 +0800 Subject: [PATCH 01/12] - add web activity --- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 35 ++++--- .../android/appenv/activitys/ActivityMain.kt | 3 +- .../android/appenv/activitys/ActivityWeb.kt | 92 +++++++++++++++++++ app/src/main/res/layout/activity_web.xml | 32 +++++++ app/src/main/res/values/strings.xml | 2 +- 6 files changed, 150 insertions(+), 18 deletions(-) create mode 100644 app/src/main/java/com/sollyu/android/appenv/activitys/ActivityWeb.kt create mode 100644 app/src/main/res/layout/activity_web.xml diff --git a/app/build.gradle b/app/build.gradle index 00b992b..33cfb6b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -50,7 +50,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" @@ -88,6 +88,8 @@ 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' } repositories { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7cb0e56..a69a494 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,6 +13,7 @@ + + + + + + + + + + - - - - - - - - + + + - + + + + \ No newline at end of file diff --git a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityMain.kt b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityMain.kt index 50f39fb..9ad221e 100644 --- a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityMain.kt +++ b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityMain.kt @@ -151,7 +151,8 @@ class ActivityMain : ActivityBase(), NavigationView.OnNavigationItemSelectedList startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://mobilecodec.alipay.com/client_download.htm?qrcode=apynckrfcfi5atfy45"))) } R.id.nav_cloud -> { - Snackbar.make(fab, "后台维护中……", Snackbar.LENGTH_LONG).show() + ActivityWeb.launch(activity, "应用变量 后台", "http://appenv.sollyu.com") + //Snackbar.make(fab, "后台维护中……", Snackbar.LENGTH_LONG).show() } R.id.nav_about -> { ActivityAbout.launch(activity) diff --git a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityWeb.kt b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityWeb.kt new file mode 100644 index 0000000..6f3347b --- /dev/null +++ b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityWeb.kt @@ -0,0 +1,92 @@ +/* + * Copyright © 2017 Sollyu + * + * 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.view.MenuItem +import android.webkit.WebView +import android.widget.LinearLayout +import com.just.agentweb.AgentWeb +import com.just.agentweb.ChromeClientCallbackManager +import com.sollyu.android.appenv.R +import kotlinx.android.synthetic.main.activity_web.* +import kotlinx.android.synthetic.main.include_toolbar.* + +class ActivityWeb : ActivityBase(), ChromeClientCallbackManager.ReceivedTitleCallback { + companion object { + fun launch(activity: Activity, webTitle: String, webUrl: String) { + val intent = Intent(activity, ActivityWeb::class.java) + + intent.putExtra("webTitle", webTitle) + intent.putExtra("webUrl", webUrl) + activity.startActivity(intent) + } + } + + val agentWeb by lazy { + AgentWeb.with(activity) + .setAgentWebParent(linearLayout, LinearLayout.LayoutParams(-1, -1)) + .useDefaultIndicator() + .defaultProgressBarColor() + .setReceivedTitleCallback(this) + .createAgentWeb() + .ready() + .go(intent.getStringExtra("webUrl")) + } + + override fun getMobclickAgentTag(): String { + return "Web" + } + + override fun onInitView() { + super.onInitView() + setContentView(R.layout.activity_web) + + setSupportActionBar(toolbar) + supportActionBar?.title = intent.getStringExtra("webTitle") + supportActionBar?.setHomeButtonEnabled(true) + supportActionBar?.setDisplayHomeAsUpEnabled(true) + + } + + override fun onInitDone() { + super.onInitDone() + agentWeb.agentWebSettings + } + + override fun onReceivedTitle(view: WebView, title: String) { + supportActionBar?.title = title + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + if (agentWeb.back()) + return true + + if (item.itemId == android.R.id.home) { + onBackPressed() + } + return super.onOptionsItemSelected(item) + } + + override fun onPause() { + super.onPause() + agentWeb.webLifeCycle.onPause() + } + + override fun onResume() { + super.onResume() + agentWeb.webLifeCycle.onResume() + } + + override fun onDestroy() { + super.onDestroy() + agentWeb.webLifeCycle.onDestroy() + } +} diff --git a/app/src/main/res/layout/activity_web.xml b/app/src/main/res/layout/activity_web.xml new file mode 100644 index 0000000..8106e80 --- /dev/null +++ b/app/src/main/res/layout/activity_web.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b6ef3ae..d17d6c4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -113,7 +113,7 @@ Thinks Xposed status error. Use Root - no english. :( + no english. :( Wipe data success Request Root Fail Sim Country Iso From 990caf6d2a79ea46674a82a8755ac09d3f6c43e6 Mon Sep 17 00:00:00 2001 From: sollyu Date: Wed, 27 Dec 2017 13:07:24 +0800 Subject: [PATCH 02/12] add upload config --- .../appenv/activitys/ActivityDetail.kt | 70 ++++++++++++++++++- .../android/appenv/activitys/ActivityMain.kt | 3 +- .../appenv/define/AppEnvConstants.java | 2 + app/src/main/res/menu/activity_detail.xml | 1 + 4 files changed, 74 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityDetail.kt b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityDetail.kt index f9fd58d..8b2643f 100644 --- a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityDetail.kt +++ b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityDetail.kt @@ -15,25 +15,33 @@ 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.xutils.view.annotation.Event import org.xutils.x +import java.io.IOException import java.util.* @@ -150,6 +158,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()} @@ -534,13 +543,72 @@ class ActivityDetail : ActivityBase() { activity.finish() } + private fun onItemClickUploadConfig() { + MaterialDialog.Builder(activity) + .title(R.string.tip) + .input("请输入保存方案的名称", "", false) { dialog, input -> + dialog.dismiss() + + val uiConfigJsonObject = uiToJsonObject(); + uiConfigJsonObject.put("config.name", input.toString()) + + val cookie = AgentWebConfig.getCookiesByUrl(AppEnvConstants.URL_APPENV_SERVER) + + val materialDialog = MaterialDialog.Builder(activity).title(R.string.tip).content(R.string.settings_update_progress).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() + } + /** * */ 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() } diff --git a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityMain.kt b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityMain.kt index 9ad221e..2594f99 100644 --- a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityMain.kt +++ b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityMain.kt @@ -32,6 +32,7 @@ import com.sollyu.android.appenv.R import com.sollyu.android.appenv.commons.Application import com.sollyu.android.appenv.commons.Settings import com.sollyu.android.appenv.commons.SettingsXposed +import com.sollyu.android.appenv.define.AppEnvConstants import com.sollyu.android.appenv.events.EventSample import com.sollyu.android.option.item.OptionItemView import kotlinx.android.synthetic.main.activity_main.* @@ -151,7 +152,7 @@ class ActivityMain : ActivityBase(), NavigationView.OnNavigationItemSelectedList startActivity(Intent(Intent.ACTION_VIEW, Uri.parse("https://mobilecodec.alipay.com/client_download.htm?qrcode=apynckrfcfi5atfy45"))) } R.id.nav_cloud -> { - ActivityWeb.launch(activity, "应用变量 后台", "http://appenv.sollyu.com") + ActivityWeb.launch(activity, "应用变量 后台", AppEnvConstants.URL_APPENV_SERVER) //Snackbar.make(fab, "后台维护中……", Snackbar.LENGTH_LONG).show() } R.id.nav_about -> { diff --git a/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java b/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java index dfdeb4a..74b3784 100644 --- a/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java +++ b/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java @@ -14,4 +14,6 @@ * 说明:常量定义类 */ public class AppEnvConstants { + public static final String URL_APPENV_SERVER = "http://appenv.sollyu.com/admin"; + public static final String URL_APPENV_UPLOAD_PACKAGE = URL_APPENV_SERVER + "/api/upload/package"; } diff --git a/app/src/main/res/menu/activity_detail.xml b/app/src/main/res/menu/activity_detail.xml index aa07d75..0601dd0 100644 --- a/app/src/main/res/menu/activity_detail.xml +++ b/app/src/main/res/menu/activity_detail.xml @@ -12,6 +12,7 @@ tools:context=".activitys.ActivityDetail"> + From 3d444bd34e180040e37e5eaf79e39c3137d57970 Mon Sep 17 00:00:00 2001 From: sollyu Date: Wed, 27 Dec 2017 15:58:35 +0800 Subject: [PATCH 03/12] no message --- .../appenv/activitys/ActivityDetail.kt | 31 ++-------- .../android/appenv/activitys/ActivityWeb.kt | 61 ++++++++++++++++++- .../appenv/define/AppEnvConstants.java | 5 +- app/src/main/res/menu/activity_detail.xml | 1 + 4 files changed, 69 insertions(+), 29 deletions(-) diff --git a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityDetail.kt b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityDetail.kt index 8b2643f..91c382d 100644 --- a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityDetail.kt +++ b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityDetail.kt @@ -550,7 +550,8 @@ class ActivityDetail : ActivityBase() { dialog.dismiss() val uiConfigJsonObject = uiToJsonObject(); - uiConfigJsonObject.put("config.name", input.toString()) + uiConfigJsonObject.put("config.name" , input.toString()) + uiConfigJsonObject.put("app.package.label", appInfo.loadLabel(activity.packageManager)) val cookie = AgentWebConfig.getCookiesByUrl(AppEnvConstants.URL_APPENV_SERVER) @@ -559,13 +560,7 @@ class ActivityDetail : ActivityBase() { 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() - } + 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) { @@ -575,26 +570,12 @@ class ActivityDetail : ActivityBase() { XLog.d(serverResult) val jsonObject = JSON.parseObject(serverResult) if (jsonObject.getInteger("ret") == 200) { - activity.runOnUiThread { - Snackbar.make(fab, "上传成功", Snackbar.LENGTH_LONG).show() - } + 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() - } + 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() - } + activity.runOnUiThread { MaterialDialog.Builder(activity).title(R.string.tip).content("上传出现错误:\n请确定您已经正确的登陆").positiveText(android.R.string.ok).show() } } } }) diff --git a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityWeb.kt b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityWeb.kt index 6f3347b..54f7ef9 100644 --- a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityWeb.kt +++ b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityWeb.kt @@ -10,14 +10,29 @@ package com.sollyu.android.appenv.activitys import android.app.Activity import android.content.Intent +import android.util.Log import android.view.MenuItem +import android.webkit.JavascriptInterface import android.webkit.WebView import android.widget.LinearLayout +import com.afollestad.materialdialogs.MaterialDialog +import com.alibaba.fastjson.JSON +import com.elvishew.xlog.XLog import com.just.agentweb.AgentWeb +import com.just.agentweb.AgentWebConfig import com.just.agentweb.ChromeClientCallbackManager import com.sollyu.android.appenv.R +import com.sollyu.android.appenv.commons.SettingsXposed +import com.sollyu.android.appenv.define.AppEnvConstants +import com.sollyu.android.appenv.events.EventSample +import com.squareup.okhttp.Callback +import com.squareup.okhttp.OkHttpClient +import com.squareup.okhttp.Request +import com.squareup.okhttp.Response import kotlinx.android.synthetic.main.activity_web.* import kotlinx.android.synthetic.main.include_toolbar.* +import org.greenrobot.eventbus.EventBus +import java.io.IOException class ActivityWeb : ActivityBase(), ChromeClientCallbackManager.ReceivedTitleCallback { companion object { @@ -53,12 +68,11 @@ class ActivityWeb : ActivityBase(), ChromeClientCallbackManager.ReceivedTitleCal supportActionBar?.title = intent.getStringExtra("webTitle") supportActionBar?.setHomeButtonEnabled(true) supportActionBar?.setDisplayHomeAsUpEnabled(true) - } override fun onInitDone() { super.onInitDone() - agentWeb.agentWebSettings + agentWeb.jsInterfaceHolder.addJavaObject("android", JsInterfaceHolder()) } override fun onReceivedTitle(view: WebView, title: String) { @@ -89,4 +103,47 @@ class ActivityWeb : ActivityBase(), ChromeClientCallbackManager.ReceivedTitleCal super.onDestroy() agentWeb.webLifeCycle.onDestroy() } + + inner class JsInterfaceHolder{ + + @Suppress("unused") + @JavascriptInterface + fun downloadConfig(configId: String, packageName: String, configName: String, packageLabel: String) { + MaterialDialog.Builder(activity) + .title(R.string.tip) + .content("确定下载:$configName 到 $packageLabel ?") + .positiveText("确定") + .negativeText(android.R.string.cancel) + .onPositive { dialog, which -> + val cookie = AgentWebConfig.getCookiesByUrl(AppEnvConstants.URL_APPENV_SERVER) + OkHttpClient().newCall(Request.Builder().url(AppEnvConstants.URL_APPENV_DOWNLOAD_PACKAGE + "?config_id=" + configId).header("Cookie", cookie).build()).enqueue(object : Callback { + override fun onFailure(request: Request, e: IOException) { + dialog.dismiss() + XLog.e(e.toString(), e) + 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) { + dialog.dismiss() + val serverResult = response.body().string() + XLog.d(serverResult) + try { + val resultJsonObject = JSON.parseObject(serverResult) + if (resultJsonObject.getInteger("ret") == 200) { + SettingsXposed.Instance.set(packageName, resultJsonObject.getJSONObject("data")) + EventBus.getDefault().postSticky(EventSample(EventSample.TYPE.MAIN_REFRESH)) + activity.runOnUiThread { MaterialDialog.Builder(activity).title(R.string.tip).content("下载并应用成功").positiveText(android.R.string.ok).show() } + } else { + activity.runOnUiThread { MaterialDialog.Builder(activity).title(R.string.tip).content("上传出现错误:\n" + resultJsonObject.getString("msg")).positiveText(android.R.string.ok).show() } + } + } catch (e: Exception) { + activity.runOnUiThread { MaterialDialog.Builder(activity).title(R.string.tip).content("下载出现错误:\n请确定您已经正确的登陆").positiveText(android.R.string.ok).show() } + } + } + }) + } + .show() + } + } + } diff --git a/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java b/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java index 74b3784..2f41a7d 100644 --- a/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java +++ b/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java @@ -14,6 +14,7 @@ * 说明:常量定义类 */ public class AppEnvConstants { - public static final String URL_APPENV_SERVER = "http://appenv.sollyu.com/admin"; - public static final String URL_APPENV_UPLOAD_PACKAGE = URL_APPENV_SERVER + "/api/upload/package"; + public static final String URL_APPENV_SERVER = "http://appenv.sollyu.com/admin"; + public static final String URL_APPENV_UPLOAD_PACKAGE = URL_APPENV_SERVER + "/api/upload/package"; + public static final String URL_APPENV_DOWNLOAD_PACKAGE = URL_APPENV_SERVER + "/api/download/package"; } diff --git a/app/src/main/res/menu/activity_detail.xml b/app/src/main/res/menu/activity_detail.xml index 0601dd0..48c5936 100644 --- a/app/src/main/res/menu/activity_detail.xml +++ b/app/src/main/res/menu/activity_detail.xml @@ -13,6 +13,7 @@ + From 80a346fc09e082be4377be79035002437c023a42 Mon Sep 17 00:00:00 2001 From: sollyu Date: Wed, 27 Dec 2017 18:37:25 +0800 Subject: [PATCH 04/12] add qr scan activity. --- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 10 +- .../android/appenv/activitys/ActivityBase.kt | 2 +- .../appenv/activitys/ActivityDetail.kt | 45 +++++- .../appenv/activitys/ActivityScanQR.kt | 142 ++++++++++++++++++ .../appenv/activitys/ActivitySettings.kt | 27 ++-- .../appenv/define/AppEnvConstants.java | 4 +- .../android/appenv/events/EventSample.kt | 17 ++- app/src/main/res/layout/activity_scan_qr.xml | 29 ++++ app/src/main/res/values/strings.xml | 1 + 10 files changed, 257 insertions(+), 24 deletions(-) create mode 100644 app/src/main/java/com/sollyu/android/appenv/activitys/ActivityScanQR.kt create mode 100644 app/src/main/res/layout/activity_scan_qr.xml diff --git a/app/build.gradle b/app/build.gradle index 33cfb6b..32472a9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,7 +20,7 @@ android { defaultConfig { applicationId "com.sollyu.xposed.hook.model" - minSdkVersion 15 + minSdkVersion 16 targetSdkVersion 26 versionCode 585 versionName "3.2.4." + getGitVersion() @@ -90,6 +90,8 @@ dependencies { 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 { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a69a494..b7605af 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,7 +13,11 @@ - + + + + + - + - + \ No newline at end of file diff --git a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityBase.kt b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityBase.kt index e99dca9..cbd564d 100644 --- a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityBase.kt +++ b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityBase.kt @@ -32,7 +32,7 @@ abstract class ActivityBase : AppCompatActivity() { onInitView() onInitData() onInitListener() - Handler().post { onInitDone() } + activity.runOnUiThread { onInitDone() } } open fun onInitView() {} diff --git a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityDetail.kt b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityDetail.kt index 91c382d..108915e 100644 --- a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityDetail.kt +++ b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityDetail.kt @@ -8,6 +8,7 @@ package com.sollyu.android.appenv.activitys +import android.annotation.SuppressLint import android.app.Activity import android.app.ProgressDialog.show import android.content.Intent @@ -39,6 +40,8 @@ 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 @@ -80,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) @@ -145,6 +149,11 @@ class ActivityDetail : ActivityBase() { } } + override fun onDestroy() { + super.onDestroy() + EventBus.getDefault().unregister(this) + } + override fun getMobclickAgentTag(): String { return "Detail" } @@ -159,6 +168,7 @@ class ActivityDetail : ActivityBase() { when (item.itemId) { R.id.menuDeleteConfig -> { this.onItemClickDeleteConfig() } R.id.menuUploadConfig -> { this.onItemClickUploadConfig() } + R.id.menuScanQRCode -> { this.onItemClickScanQRCode() } R.id.menuSolutionSave -> { this.onItemClickSolutionSave() } R.id.menuSolutionLoad -> { this.onItemClickSolutionLoad() } R.id.menuSolutionDele -> { this.onItemClickSolutionDelete()} @@ -167,6 +177,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 -> { + } + } + } + /** * */ @@ -544,6 +572,12 @@ class ActivityDetail : ActivityBase() { } 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 -> @@ -553,9 +587,7 @@ class ActivityDetail : ActivityBase() { uiConfigJsonObject.put("config.name" , input.toString()) uiConfigJsonObject.put("app.package.label", appInfo.loadLabel(activity.packageManager)) - val cookie = AgentWebConfig.getCookiesByUrl(AppEnvConstants.URL_APPENV_SERVER) - - val materialDialog = MaterialDialog.Builder(activity).title(R.string.tip).content(R.string.settings_update_progress).progress(true, 0).cancelable(false).show() + 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) { @@ -583,6 +615,13 @@ class ActivityDetail : ActivityBase() { .show() } + /** + * + */ + private fun onItemClickScanQRCode() { + ActivityScanQR.launch(activity, ActivityScanQR.FROM_DETAIL) + } + /** * */ diff --git a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityScanQR.kt b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityScanQR.kt new file mode 100644 index 0000000..85f90f1 --- /dev/null +++ b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityScanQR.kt @@ -0,0 +1,142 @@ +/* + * Copyright © 2017 Sollyu + * + * 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.Manifest +import android.app.Activity +import android.content.Intent +import android.util.Log +import android.widget.Toast +import com.afollestad.materialdialogs.MaterialDialog +import com.alibaba.fastjson.JSON +import com.elvishew.xlog.XLog +import com.sollyu.android.appenv.R +import com.sollyu.android.appenv.commons.SettingsXposed +import com.sollyu.android.appenv.define.AppEnvConstants +import com.sollyu.android.appenv.events.EventSample +import com.squareup.okhttp.Callback +import com.squareup.okhttp.OkHttpClient +import com.squareup.okhttp.Request +import com.squareup.okhttp.Response +import kotlinx.android.synthetic.main.activity_scan_qr.* +import kotlinx.android.synthetic.main.activity_scan_qr.view.* +import kotlinx.android.synthetic.main.include_toolbar.* +import org.greenrobot.eventbus.EventBus +import ru.alexbykov.nopermission.PermissionHelper +import java.io.IOException + +class ActivityScanQR : ActivityBase(){ + private val permissionHelper by lazy { PermissionHelper(activity) } + private val fromActivity by lazy { activity.intent.getIntExtra("fromActivity", ActivityScanQR.FROM_DETAIL) } + + companion object { + val FROM_DETAIL = 1 + + fun launch(activity: Activity, fromActivity: Int) { + val intent = Intent(activity, ActivityScanQR::class.java) + intent.putExtra("fromActivity", fromActivity) + activity.startActivity(intent) + } + } + + override fun getMobclickAgentTag(): String { + return "ScanQR" + } + + override fun onInitView() { + super.onInitView() + setContentView(R.layout.activity_scan_qr) + + setSupportActionBar(toolbar) + supportActionBar?.setTitle(R.string.scan_qr) + supportActionBar?.setHomeButtonEnabled(true) + supportActionBar?.setDisplayHomeAsUpEnabled(true) + } + + override fun onInitDone() { + super.onInitDone() + + permissionHelper.check(Manifest.permission.CAMERA) + permissionHelper.onSuccess{ + var justOnce = 0 + qrCodeReaderView.setQRDecodingEnabled(true); + qrCodeReaderView.setAutofocusInterval(2000L) + qrCodeReaderView.setTorchEnabled(true) + qrCodeReaderView.setOnQRCodeReadListener { text, _ -> + qrCodeReaderView.stopCamera() + if (text.startsWith(AppEnvConstants.URL_APPENV_SHARE_START)) { + + if (justOnce > 0) { + return@setOnQRCodeReadListener + } + justOnce += 1 + + val materialDialog = MaterialDialog.Builder(activity).title(R.string.tip).content("下载中……").progress(true, 0).cancelable(false).show() + OkHttpClient().newCall(Request.Builder().url(text).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() + val serverResult = response.body().string() + try { + val resultJsonObject = JSON.parseObject(serverResult) + if (resultJsonObject.getInteger("ret") == 200) { + if (fromActivity == FROM_DETAIL) { + EventBus.getDefault().post(EventSample(EventSample.TYPE.DETAIL_JSON_2_UI, resultJsonObject.getJSONObject("data"))) + activity.finish() + } + } else { + qrCodeReaderView.startCamera() + activity.runOnUiThread { MaterialDialog.Builder(activity).title(R.string.tip).content("下载出现错误:\n" + resultJsonObject.getString("msg")).positiveText(android.R.string.ok).show() } + } + } catch (e: Exception) { + qrCodeReaderView.startCamera() + activity.runOnUiThread { MaterialDialog.Builder(activity).title(R.string.tip).content("下载出现错误").positiveText(android.R.string.ok).show() } + } + } + }) + } else { + MaterialDialog.Builder(activity).title(R.string.tip).content("此二维码不是应用变量分享的内容").onAny { _, _ -> qrCodeReaderView.startCamera() }.show() + } + } + qrCodeReaderView.setBackCamera() + qrCodeReaderView.startCamera() + } + permissionHelper.onDenied { + MaterialDialog.Builder(activity) + .title(R.string.tip) + .content(R.string.splash_permission_write_storage_denied_content) + .positiveText(android.R.string.ok) + .show() + } + permissionHelper.onNeverAskAgain { + Toast.makeText(activity, R.string.splash_permission_write_storage_denied_content, Toast.LENGTH_LONG).show() + } + permissionHelper.run() + } + + override fun onResume() { + super.onResume() + qrCodeReaderView.startCamera() + } + + override fun onPause() { + super.onPause() + qrCodeReaderView.stopCamera() + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + permissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults) + } + +} diff --git a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivitySettings.kt b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivitySettings.kt index 2f3a81c..658b0ec 100644 --- a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivitySettings.kt +++ b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivitySettings.kt @@ -205,19 +205,20 @@ class ActivitySettings : ActivityBase() { @Event(R.id.oivLicence) private fun onBtnClickLicence(@Suppress("UNUSED_PARAMETER") view: View) { val notices = Notices() - notices.addNotice(Notice("NotProguard" , "https://github.com/kingsollyu/NotProguard" , "Copyright 2017 Sollyu" , ApacheSoftwareLicense20())) - notices.addNotice(Notice("OptionItem" , "https://github.com/kingsollyu/OptionItem" , "Copyright 2017 Sollyu" , ApacheSoftwareLicense20())) - notices.addNotice(Notice("Apache Commons IO" , "https://github.com/apache/commons-io" , "Apache License" , ApacheSoftwareLicense20())) - notices.addNotice(Notice("BottomSheetBuilder" , "https://github.com/rubensousa/BottomSheetBuilder", "Copyright 2016 Rúben Sousa" , ApacheSoftwareLicense20())) - notices.addNotice(Notice("xUtils3" , "https://github.com/wyouflf/xUtils3" , "Copyright 2014-2015 wyouflf" , ApacheSoftwareLicense20())) - notices.addNotice(Notice("xLog" , "https://github.com/elvishew/xLog" , "Copyright 2016 Elvis Hew" , ApacheSoftwareLicense20())) - notices.addNotice(Notice("fastjson" , "https://github.com/alibaba/fastjson" , "Copyright 1999-2016 Alibaba Group Holding Ltd." , ApacheSoftwareLicense20())) - notices.addNotice(Notice("FloatingActionButton", "https://github.com/Clans/FloatingActionButton" , "Copyright 2015 Dmytro Tarianyk" , ApacheSoftwareLicense20())) - notices.addNotice(Notice("EventBus" , "https://github.com/greenrobot/EventBus" , "Copyright (C) 2012-2017 Markus Junginger greenrobot (http://greenrobot.org)", ApacheSoftwareLicense20())) - notices.addNotice(Notice("LicensesDialog" , "https://github.com/PSDev/LicensesDialog" , "Copyright 2013-2017 Philip Schiffer" , ApacheSoftwareLicense20())) - notices.addNotice(Notice("libsuperuser" , "https://github.com/Chainfire/libsuperuser" , "Written by and copyright ©: Jorrit \"Chainfire\" Jongma Author of SuperSU" , ApacheSoftwareLicense20())) - notices.addNotice(Notice("NoPermission" , "https://github.com/NoNews/NoPermission" , "Copyright 2017 Mike Antipiev and Alex Bykov" , ApacheSoftwareLicense20())) - notices.addNotice(Notice("material-dialogs" , "https://github.com/afollestad/material-dialogs" , "Copyright (c) 2014-2016 Aidan Michael Follestad" , MITLicense()) ) + notices.addNotice(Notice("NotProguard" , "https://github.com/kingsollyu/NotProguard" , "Copyright 2017 Sollyu" , ApacheSoftwareLicense20())) + notices.addNotice(Notice("OptionItem" , "https://github.com/kingsollyu/OptionItem" , "Copyright 2017 Sollyu" , ApacheSoftwareLicense20())) + notices.addNotice(Notice("Apache Commons IO" , "https://github.com/apache/commons-io" , "Apache License" , ApacheSoftwareLicense20())) + notices.addNotice(Notice("BottomSheetBuilder" , "https://github.com/rubensousa/BottomSheetBuilder" , "Copyright 2016 Rúben Sousa" , ApacheSoftwareLicense20())) + notices.addNotice(Notice("xUtils3" , "https://github.com/wyouflf/xUtils3" , "Copyright 2014-2015 wyouflf" , ApacheSoftwareLicense20())) + notices.addNotice(Notice("xLog" , "https://github.com/elvishew/xLog" , "Copyright 2016 Elvis Hew" , ApacheSoftwareLicense20())) + notices.addNotice(Notice("fastjson" , "https://github.com/alibaba/fastjson" , "Copyright 1999-2016 Alibaba Group Holding Ltd." , ApacheSoftwareLicense20())) + notices.addNotice(Notice("FloatingActionButton" , "https://github.com/Clans/FloatingActionButton" , "Copyright 2015 Dmytro Tarianyk" , ApacheSoftwareLicense20())) + notices.addNotice(Notice("EventBus" , "https://github.com/greenrobot/EventBus" , "Copyright (C) 2012-2017 Markus Junginger greenrobot (http://greenrobot.org)", ApacheSoftwareLicense20())) + notices.addNotice(Notice("LicensesDialog" , "https://github.com/PSDev/LicensesDialog" , "Copyright 2013-2017 Philip Schiffer" , ApacheSoftwareLicense20())) + notices.addNotice(Notice("libsuperuser" , "https://github.com/Chainfire/libsuperuser" , "Written by and copyright ©: Jorrit \"Chainfire\" Jongma Author of SuperSU" , ApacheSoftwareLicense20())) + notices.addNotice(Notice("NoPermission" , "https://github.com/NoNews/NoPermission" , "Copyright 2017 Mike Antipiev and Alex Bykov" , ApacheSoftwareLicense20())) + notices.addNotice(Notice("QrCodeScannerView-Android" , "https://github.com/qingmei2/QrCodeScannerView-Android" , "Copyright (c) 2017 qingmei2" , ApacheSoftwareLicense20())) + notices.addNotice(Notice("material-dialogs" , "https://github.com/afollestad/material-dialogs" , "Copyright (c) 2014-2016 Aidan Michael Follestad" , MITLicense()) ) LicensesDialog.Builder(activity).setNotices(notices).build().showAppCompat() } diff --git a/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java b/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java index 2f41a7d..c987788 100644 --- a/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java +++ b/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java @@ -14,7 +14,9 @@ * 说明:常量定义类 */ public class AppEnvConstants { - public static final String URL_APPENV_SERVER = "http://appenv.sollyu.com/admin"; + public static final String URL_APPENV_HOST = "http://appenv.sollyu.com"; + public static final String URL_APPENV_SERVER = URL_APPENV_HOST + "/admin"; public static final String URL_APPENV_UPLOAD_PACKAGE = URL_APPENV_SERVER + "/api/upload/package"; public static final String URL_APPENV_DOWNLOAD_PACKAGE = URL_APPENV_SERVER + "/api/download/package"; + public static final String URL_APPENV_SHARE_START = URL_APPENV_HOST + "/share"; } diff --git a/app/src/main/java/com/sollyu/android/appenv/events/EventSample.kt b/app/src/main/java/com/sollyu/android/appenv/events/EventSample.kt index a4d4e0a..6e319da 100644 --- a/app/src/main/java/com/sollyu/android/appenv/events/EventSample.kt +++ b/app/src/main/java/com/sollyu/android/appenv/events/EventSample.kt @@ -13,8 +13,21 @@ package com.sollyu.android.appenv.events * 时间:2017/10/30 * 说明: */ -class EventSample(val eventTYPE: TYPE) { +class EventSample { enum class TYPE { - MAIN_REFRESH, MAIN_LIST_CLEAR, MAIN_THEME_NIGHT + MAIN_REFRESH, MAIN_LIST_CLEAR, MAIN_THEME_NIGHT, + DETAIL_JSON_2_UI, } + + constructor(eventTYPE: TYPE) { + this.eventTYPE = eventTYPE + } + + constructor(eventTYPE: TYPE, value: Any) { + this.eventTYPE = eventTYPE + this.value = value + } + + val eventTYPE: TYPE + var value: Any? = null } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_scan_qr.xml b/app/src/main/res/layout/activity_scan_qr.xml new file mode 100644 index 0000000..3aeec32 --- /dev/null +++ b/app/src/main/res/layout/activity_scan_qr.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d17d6c4..fdb44c6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -122,4 +122,5 @@ Use app data Config Use app data Config? AppEnv need write external storeage permission. :( + Scan QR From f19e2db985d1f7f36ede7a2769162dd3661a81c3 Mon Sep 17 00:00:00 2001 From: sollyu Date: Wed, 27 Dec 2017 18:43:05 +0800 Subject: [PATCH 05/12] add some language. --- app/src/main/res/menu/activity_detail.xml | 4 ++-- app/src/main/res/values-zh/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/menu/activity_detail.xml b/app/src/main/res/menu/activity_detail.xml index 48c5936..2b73c60 100644 --- a/app/src/main/res/menu/activity_detail.xml +++ b/app/src/main/res/menu/activity_detail.xml @@ -12,8 +12,8 @@ tools:context=".activitys.ActivityDetail"> - - + + diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index da1a961..6857421 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -132,4 +132,6 @@ 使用内置存储 【内置存储特性】\n支持「没有SD卡权限」应用拦截\n不支持「7.0+」以上系统\n\n【外置存储特性】\n不支持「没有SD卡权限」应用拦截\n方便直接修改配置文件\n兼容所有系统\n\n您确定使用内置存储吗? 应用变量需要内存卡读取权限才能正常使用\n\n问:为什么要权限?\n答:因为在Android7.0+之后,Android系统为了手机系统的安全,删除了一个名字叫做【MODE_WORLD_READABLE】的权限,此权限是允许其他程序访问使用这个权限设置的文件,这也是应用变量提供被拦截程序的一个配置入口。因为系统删除了这个权限,外加上本人菜鸡,无奈只能使用SD来存放此配置文件,从而达到让别的程序来读取。\n\n问:如果我不给会怎么样?\n答:如果您的系统在Android7.0之前,那么您可以在设置中设置成使用内置存储,这样您就可以正常使用本软件了。那如果您的系统是Android7.0+,因为不能保存配置文件在内存卡里,所以我感觉您应该不能正常使用本软件。\n\n问:但是我真的很讨厌这个权限\n答:在这里我仅作为作者来告诉您,本软件【永久】不会增加任何性质的广告,也不会在您的手机内存卡里生成各种乱七八糟的文件。但是因为本软件使用来一个叫做【友盟】的统计,它好像会在您的SD卡下生成一个叫做【umeng】的文件夹。\n\n问:……\n答:…………\n + 扫一扫 + 上传配置 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fdb44c6..cc53b8a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -123,4 +123,5 @@ Use app data Config? AppEnv need write external storeage permission. :( Scan QR + Upload Config From cce2cdf013fe3a7203e57d64ce973d9c1024f910 Mon Sep 17 00:00:00 2001 From: sollyu Date: Thu, 28 Dec 2017 11:02:27 +0800 Subject: [PATCH 06/12] use https --- .../java/com/sollyu/android/appenv/define/AppEnvConstants.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java b/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java index c987788..c85cf96 100644 --- a/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java +++ b/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java @@ -14,7 +14,7 @@ * 说明:常量定义类 */ public class AppEnvConstants { - public static final String URL_APPENV_HOST = "http://appenv.sollyu.com"; + public static final String URL_APPENV_HOST = "https://appenv.sollyu.com"; public static final String URL_APPENV_SERVER = URL_APPENV_HOST + "/admin"; public static final String URL_APPENV_UPLOAD_PACKAGE = URL_APPENV_SERVER + "/api/upload/package"; public static final String URL_APPENV_DOWNLOAD_PACKAGE = URL_APPENV_SERVER + "/api/download/package"; From 4f251a8415d0b7649800771a74beea1b57ec58d4 Mon Sep 17 00:00:00 2001 From: sollyu Date: Thu, 28 Dec 2017 13:53:15 +0800 Subject: [PATCH 07/12] add phone report --- app/src/main/AndroidManifest.xml | 1 + .../appenv/activitys/ActivityDetail.kt | 2 +- .../android/appenv/activitys/ActivityWeb.kt | 1 - .../android/appenv/commons/Application.kt | 5 +- .../android/appenv/commons/PhoneReport.kt | 91 +++++++++++++++++++ .../appenv/define/AppEnvConstants.java | 1 + 6 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/sollyu/android/appenv/commons/PhoneReport.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b7605af..42d2113 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,6 +13,7 @@ + diff --git a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityDetail.kt b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityDetail.kt index 108915e..c4484bd 100644 --- a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityDetail.kt +++ b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityDetail.kt @@ -511,7 +511,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) diff --git a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityWeb.kt b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityWeb.kt index 54f7ef9..b1a1d2b 100644 --- a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityWeb.kt +++ b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityWeb.kt @@ -126,7 +126,6 @@ class ActivityWeb : ActivityBase(), ChromeClientCallbackManager.ReceivedTitleCal override fun onResponse(response: Response) { dialog.dismiss() val serverResult = response.body().string() - XLog.d(serverResult) try { val resultJsonObject = JSON.parseObject(serverResult) if (resultJsonObject.getInteger("ret") == 200) { diff --git a/app/src/main/java/com/sollyu/android/appenv/commons/Application.kt b/app/src/main/java/com/sollyu/android/appenv/commons/Application.kt index f1e8be2..e578872 100644 --- a/app/src/main/java/com/sollyu/android/appenv/commons/Application.kt +++ b/app/src/main/java/com/sollyu/android/appenv/commons/Application.kt @@ -48,7 +48,7 @@ class Application : android.app.Application(), Thread.UncaughtExceptionHandler { super.onCreate() // 初始化日志 - val logConfiguration = LogConfiguration.Builder().tag("Xposed").b().logLevel(if (BuildConfig.DEBUG) LogLevel.ALL else LogLevel.WARN).build() + val logConfiguration = LogConfiguration.Builder().tag("Xposed").logLevel(if (BuildConfig.DEBUG) LogLevel.ALL else LogLevel.WARN).build() val logAndroid = AndroidPrinter() val logFile = FilePrinter.Builder(Instance.externalCacheDir.absolutePath).backupStrategy(NeverBackupStrategy()).fileNameGenerator(DateFileNameGenerator()).build() XLog.init(logConfiguration, logAndroid, logFile) @@ -68,6 +68,9 @@ class Application : android.app.Application(), Thread.UncaughtExceptionHandler { FileUtils.writeStringToFile(Phones.Instance.phoneFile, IOUtils.toString(Instance.assets.open("app.env.phone.json"), "UTF-8"), "UTF-8") } Phones.Reload() + + // 汇报机型 + PhoneReport.Instance.start() } override fun uncaughtException(t: Thread?, throwable: Throwable?) { diff --git a/app/src/main/java/com/sollyu/android/appenv/commons/PhoneReport.kt b/app/src/main/java/com/sollyu/android/appenv/commons/PhoneReport.kt new file mode 100644 index 0000000..8990be5 --- /dev/null +++ b/app/src/main/java/com/sollyu/android/appenv/commons/PhoneReport.kt @@ -0,0 +1,91 @@ +/* + * Copyright © 2017 Sollyu + * + * 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.commons + +import android.annotation.SuppressLint +import android.content.Context +import android.net.wifi.WifiInfo +import android.net.wifi.WifiManager +import android.os.Build +import android.preference.PreferenceManager +import android.telephony.TelephonyManager +import com.alibaba.fastjson.JSON +import com.elvishew.xlog.XLog +import com.sollyu.android.appenv.define.AppEnvConstants +import com.squareup.okhttp.* +import org.apache.commons.io.FileUtils +import java.io.File +import java.io.IOException + +/** + * 作者:sollyu + * 时间:2017/12/28 + * 说明: + */ +class PhoneReport { + companion object { + var Instance = PhoneReport() + } + + @SuppressLint("WifiManagerLeak") + fun start() { + val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(Application.Instance) + if (sharedPreferences.getBoolean("report_phone", false)) { + return + } + + val umengFile = File(Application.Instance.filesDir, ".umeng/exchangeIdentity.json") + if (!umengFile.exists() || !umengFile.canRead()) { + return + } + + val umengJson = JSON.parseObject(FileUtils.readFileToString(umengFile, "UTF-8")) + if (umengJson.getString("umid") == null || umengJson.getString("umid").isEmpty()) { + return + } + + val postBody = FormEncodingBuilder() + postBody.add("android.umeng.umid" , umengJson.getString("umid")) + postBody.add("android.os.Build.ro.product.manufacturer", Build.MANUFACTURER) + postBody.add("android.os.Build.ro.product.model" , Build.MODEL) + postBody.add("android.os.Build.ro.product.fingerprint" , Build.FINGERPRINT) + postBody.add("android.os.Build.ro.serialno" , Build.SERIAL) + postBody.add("android.os.Build.VERSION.RELEASE" , Build.VERSION.RELEASE) + + arrayListOf("getLine1Number", "getDeviceId", "getSubscriberId", "getSimOperator", "getSimCountryIso", "getSimOperatorName", "getSimSerialNumber", "getSimState").forEach { + try { + val telephonyManager = Application.Instance.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager + postBody.add("android.telephony.TelephonyManager.$it", TelephonyManager::class.java.getMethod(it).invoke(telephonyManager).toString()) + } catch (t: Throwable) { } + } + + arrayListOf("getSSID", "getBSSID", "getMacAddress").forEach { + try { + val wifiManager = Application.Instance.getSystemService(Context.WIFI_SERVICE) as WifiManager + val connectionInfo = wifiManager.connectionInfo + postBody.add("android.net.wifi.WifiInfo.$it", WifiInfo::class.java.getMethod(it).invoke(connectionInfo).toString()) + } catch (t: Throwable) { } + } + + OkHttpClient().newCall(Request.Builder().url(AppEnvConstants.URL_APPENV_REPORT_PHONE).post(postBody.build()).build()).enqueue(object : Callback{ + override fun onFailure(request: Request, e: IOException) { } + + override fun onResponse(response: Response) { + val serverResult = response.body().string() + try { + val resultJsonObject = JSON.parseObject(serverResult) + if (resultJsonObject.getInteger("ret") == 200) { + sharedPreferences.edit().putBoolean("report_phone", true).apply() + } + } catch (e: Exception) { } + } + }) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java b/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java index c85cf96..73996d1 100644 --- a/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java +++ b/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java @@ -19,4 +19,5 @@ public class AppEnvConstants { public static final String URL_APPENV_UPLOAD_PACKAGE = URL_APPENV_SERVER + "/api/upload/package"; public static final String URL_APPENV_DOWNLOAD_PACKAGE = URL_APPENV_SERVER + "/api/download/package"; public static final String URL_APPENV_SHARE_START = URL_APPENV_HOST + "/share"; + public static final String URL_APPENV_REPORT_PHONE = URL_APPENV_HOST + "/api/phone/report"; } From 2e24becea5be88412e4c51baabef0d1d6ca5f4ea Mon Sep 17 00:00:00 2001 From: sollyu Date: Thu, 28 Dec 2017 14:55:53 +0800 Subject: [PATCH 08/12] add log activity --- app/src/main/AndroidManifest.xml | 9 +- .../android/appenv/activitys/ActivityLog.kt | 86 +++++++++++++++++++ .../appenv/activitys/ActivitySettings.kt | 5 ++ .../appenv/activitys/ActivitySplash.kt | 6 +- .../android/appenv/activitys/ActivityWeb.kt | 1 - .../android/appenv/commons/Application.kt | 16 +++- app/src/main/res/layout/activity_log.xml | 41 +++++++++ app/src/main/res/layout/activity_settings.xml | 7 ++ app/src/main/res/menu/activity_log.xml | 17 ++++ app/src/main/res/values-zh/strings.xml | 3 + app/src/main/res/values/strings.xml | 3 + 11 files changed, 183 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/com/sollyu/android/appenv/activitys/ActivityLog.kt create mode 100644 app/src/main/res/layout/activity_log.xml create mode 100644 app/src/main/res/menu/activity_log.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 42d2113..2c355d2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,7 +13,7 @@ - + @@ -53,11 +53,13 @@ + + + + - - - \ No newline at end of file diff --git a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityLog.kt b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityLog.kt new file mode 100644 index 0000000..bf39a9d --- /dev/null +++ b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityLog.kt @@ -0,0 +1,86 @@ +/* + * Copyright © 2017 Sollyu + * + * 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.elvishew.xlog.XLog +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 = "" + } + } +} diff --git a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivitySettings.kt b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivitySettings.kt index 658b0ec..069b9ec 100644 --- a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivitySettings.kt +++ b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivitySettings.kt @@ -296,4 +296,9 @@ class ActivitySettings : ActivityBase() { } }) } + + @Event(R.id.oivLog) + private fun onBtnClickLog(view: View) { + ActivityLog.launch(activity) + } } diff --git a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivitySplash.kt b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivitySplash.kt index aeeeaa9..b3728b6 100644 --- a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivitySplash.kt +++ b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivitySplash.kt @@ -31,18 +31,20 @@ import ru.alexbykov.nopermission.PermissionHelper */ class ActivitySplash : ActivityBase(), Runnable { - val permissionHelper by lazy { PermissionHelper(activity) } + private val permissionHelper by lazy { PermissionHelper(activity) } override fun run() { /* Xposed 没有成功的状态 */ if (!Application.Instance.isXposedWork()) { + XLog.e("Xposed Is Not Work") MaterialDialog .Builder(activity) .title(R.string.splash_xposed_not_work_title) .content(R.string.splash_xposed_not_work_content) .positiveText(android.R.string.ok) - .onPositive { _, _ -> ActivityMain.launch(activity) } + .onAny { _, _ -> ActivityMain.launch(activity) } + .canceledOnTouchOutside(false) .show() return } diff --git a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityWeb.kt b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityWeb.kt index b1a1d2b..616c5ae 100644 --- a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityWeb.kt +++ b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityWeb.kt @@ -38,7 +38,6 @@ class ActivityWeb : ActivityBase(), ChromeClientCallbackManager.ReceivedTitleCal companion object { fun launch(activity: Activity, webTitle: String, webUrl: String) { val intent = Intent(activity, ActivityWeb::class.java) - intent.putExtra("webTitle", webTitle) intent.putExtra("webUrl", webUrl) activity.startActivity(intent) diff --git a/app/src/main/java/com/sollyu/android/appenv/commons/Application.kt b/app/src/main/java/com/sollyu/android/appenv/commons/Application.kt index e578872..c051e97 100644 --- a/app/src/main/java/com/sollyu/android/appenv/commons/Application.kt +++ b/app/src/main/java/com/sollyu/android/appenv/commons/Application.kt @@ -14,6 +14,8 @@ import com.elvishew.xlog.LogConfiguration import com.elvishew.xlog.LogLevel import com.elvishew.xlog.XLog import com.elvishew.xlog.XLog.logLevel +import com.elvishew.xlog.flattener.DefaultFlattener +import com.elvishew.xlog.flattener.Flattener import com.elvishew.xlog.printer.AndroidPrinter import com.elvishew.xlog.printer.file.FilePrinter import com.elvishew.xlog.printer.file.backup.NeverBackupStrategy @@ -26,6 +28,8 @@ import org.apache.commons.io.FileUtils import org.apache.commons.io.IOUtils import org.apache.commons.text.CharacterPredicates import org.apache.commons.text.RandomStringGenerator +import java.text.SimpleDateFormat +import java.util.* /** * 作者:sollyu @@ -48,12 +52,11 @@ class Application : android.app.Application(), Thread.UncaughtExceptionHandler { super.onCreate() // 初始化日志 - val logConfiguration = LogConfiguration.Builder().tag("Xposed").logLevel(if (BuildConfig.DEBUG) LogLevel.ALL else LogLevel.WARN).build() + val logConfiguration = LogConfiguration.Builder().tag("AppEnv").logLevel(if (BuildConfig.DEBUG) LogLevel.ALL else LogLevel.WARN).build() val logAndroid = AndroidPrinter() - val logFile = FilePrinter.Builder(Instance.externalCacheDir.absolutePath).backupStrategy(NeverBackupStrategy()).fileNameGenerator(DateFileNameGenerator()).build() - XLog.init(logConfiguration, logAndroid, logFile) - XLog.d("[APP START]") + val logFile = FilePrinter.Builder(Instance.externalCacheDir.absolutePath).backupStrategy(NeverBackupStrategy()).logFlattener(MyLogFlattener()).build() + XLog.init(logConfiguration, logAndroid, logFile) // 添加崩溃捕获 Thread.setDefaultUncaughtExceptionHandler(this) @@ -82,4 +85,9 @@ class Application : android.app.Application(), Thread.UncaughtExceptionHandler { return false } + inner class MyLogFlattener : Flattener { + override fun flatten(logLevel: Int, tag: String, message: String): CharSequence { + return SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()).format(Date(System.currentTimeMillis())) + " [" + LogLevel.getShortLevelName(logLevel) + "] " + message + } + } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_log.xml b/app/src/main/res/layout/activity_log.xml new file mode 100644 index 0000000..919b55d --- /dev/null +++ b/app/src/main/res/layout/activity_log.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 1624841..01b1d0a 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -116,6 +116,13 @@ android:layout_marginTop="20dp" app:leftText="@string/settings_thinks" /> + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 6857421..afb6e54 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -134,4 +134,7 @@ 应用变量需要内存卡读取权限才能正常使用\n\n问:为什么要权限?\n答:因为在Android7.0+之后,Android系统为了手机系统的安全,删除了一个名字叫做【MODE_WORLD_READABLE】的权限,此权限是允许其他程序访问使用这个权限设置的文件,这也是应用变量提供被拦截程序的一个配置入口。因为系统删除了这个权限,外加上本人菜鸡,无奈只能使用SD来存放此配置文件,从而达到让别的程序来读取。\n\n问:如果我不给会怎么样?\n答:如果您的系统在Android7.0之前,那么您可以在设置中设置成使用内置存储,这样您就可以正常使用本软件了。那如果您的系统是Android7.0+,因为不能保存配置文件在内存卡里,所以我感觉您应该不能正常使用本软件。\n\n问:但是我真的很讨厌这个权限\n答:在这里我仅作为作者来告诉您,本软件【永久】不会增加任何性质的广告,也不会在您的手机内存卡里生成各种乱七八糟的文件。但是因为本软件使用来一个叫做【友盟】的统计,它好像会在您的SD卡下生成一个叫做【umeng】的文件夹。\n\n问:……\n答:…………\n 扫一扫 上传配置 + 运行日志 + 删除 + 刷新 \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index cc53b8a..dae0ff8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -124,4 +124,7 @@ AppEnv need write external storeage permission. :( Scan QR Upload Config + Logs + Delete + Reload From a9c373c1d59b08631f4ada51f157c9a1204cc351 Mon Sep 17 00:00:00 2001 From: sollyu Date: Thu, 28 Dec 2017 15:33:52 +0800 Subject: [PATCH 09/12] move scan qr --- .../android/appenv/activitys/ActivityDetail.kt | 4 ++-- .../android/appenv/activitys/ActivityLog.kt | 1 - .../sollyu/android/appenv/commons/Application.kt | 5 ----- app/src/main/res/drawable/ic_scan.xml | 16 ++++++++++++++++ app/src/main/res/layout/activity_detail.xml | 10 ++++++++++ app/src/main/res/menu/activity_detail.xml | 1 - 6 files changed, 28 insertions(+), 9 deletions(-) create mode 100644 app/src/main/res/drawable/ic_scan.xml diff --git a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityDetail.kt b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityDetail.kt index c4484bd..33885b8 100644 --- a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityDetail.kt +++ b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityDetail.kt @@ -168,7 +168,6 @@ class ActivityDetail : ActivityBase() { when (item.itemId) { R.id.menuDeleteConfig -> { this.onItemClickDeleteConfig() } R.id.menuUploadConfig -> { this.onItemClickUploadConfig() } - R.id.menuScanQRCode -> { this.onItemClickScanQRCode() } R.id.menuSolutionSave -> { this.onItemClickSolutionSave() } R.id.menuSolutionLoad -> { this.onItemClickSolutionLoad() } R.id.menuSolutionDele -> { this.onItemClickSolutionDelete()} @@ -618,7 +617,8 @@ class ActivityDetail : ActivityBase() { /** * */ - private fun onItemClickScanQRCode() { + @Event(R.id.menu_scan_qr_code) + private fun onItemClickScanQRCode(view: View) { ActivityScanQR.launch(activity, ActivityScanQR.FROM_DETAIL) } diff --git a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityLog.kt b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityLog.kt index bf39a9d..8e72a29 100644 --- a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityLog.kt +++ b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityLog.kt @@ -13,7 +13,6 @@ import android.content.Intent import android.text.method.ScrollingMovementMethod import android.view.Menu import android.view.MenuItem -import com.elvishew.xlog.XLog import com.sollyu.android.appenv.R import com.sollyu.android.appenv.commons.Application import kotlinx.android.synthetic.main.activity_log.* diff --git a/app/src/main/java/com/sollyu/android/appenv/commons/Application.kt b/app/src/main/java/com/sollyu/android/appenv/commons/Application.kt index c051e97..107cecf 100644 --- a/app/src/main/java/com/sollyu/android/appenv/commons/Application.kt +++ b/app/src/main/java/com/sollyu/android/appenv/commons/Application.kt @@ -13,21 +13,16 @@ import android.support.v7.app.AppCompatDelegate import com.elvishew.xlog.LogConfiguration import com.elvishew.xlog.LogLevel import com.elvishew.xlog.XLog -import com.elvishew.xlog.XLog.logLevel -import com.elvishew.xlog.flattener.DefaultFlattener import com.elvishew.xlog.flattener.Flattener import com.elvishew.xlog.printer.AndroidPrinter import com.elvishew.xlog.printer.file.FilePrinter import com.elvishew.xlog.printer.file.backup.NeverBackupStrategy -import com.elvishew.xlog.printer.file.naming.DateFileNameGenerator import com.sollyu.android.appenv.BuildConfig import com.sollyu.android.not.proguard.NotProguard import com.umeng.analytics.MobclickAgent import com.umeng.commonsdk.UMConfigure import org.apache.commons.io.FileUtils import org.apache.commons.io.IOUtils -import org.apache.commons.text.CharacterPredicates -import org.apache.commons.text.RandomStringGenerator import java.text.SimpleDateFormat import java.util.* diff --git a/app/src/main/res/drawable/ic_scan.xml b/app/src/main/res/drawable/ic_scan.xml new file mode 100644 index 0000000..bfc9b25 --- /dev/null +++ b/app/src/main/res/drawable/ic_scan.xml @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/activity_detail.xml b/app/src/main/res/layout/activity_detail.xml index cf9deaf..359beee 100644 --- a/app/src/main/res/layout/activity_detail.xml +++ b/app/src/main/res/layout/activity_detail.xml @@ -34,6 +34,16 @@ app:menu_labels_singleLine="true" app:srcCompat="@android:drawable/ic_dialog_email"> + + + - From 1506cb56b74dbf722442bbc5ff2b9940d0ac5712 Mon Sep 17 00:00:00 2001 From: sollyu Date: Thu, 28 Dec 2017 17:34:34 +0800 Subject: [PATCH 10/12] add register activity --- app/src/main/AndroidManifest.xml | 3 +- .../android/appenv/activitys/ActivityMain.kt | 1 + .../appenv/activitys/ActivityRegister.kt | 82 +++++++++ .../android/appenv/activitys/ActivityWeb.kt | 6 + .../appenv/define/AppEnvConstants.java | 1 + app/src/main/res/layout/activity_register.xml | 170 ++++++++++++++++++ app/src/main/res/values-zh/strings.xml | 2 + app/src/main/res/values/strings.xml | 2 + 8 files changed, 266 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/sollyu/android/appenv/activitys/ActivityRegister.kt create mode 100644 app/src/main/res/layout/activity_register.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2c355d2..be83a39 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -56,7 +56,8 @@ - + + diff --git a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityMain.kt b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityMain.kt index 2594f99..6802429 100644 --- a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityMain.kt +++ b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityMain.kt @@ -153,6 +153,7 @@ class ActivityMain : ActivityBase(), NavigationView.OnNavigationItemSelectedList } R.id.nav_cloud -> { ActivityWeb.launch(activity, "应用变量 后台", AppEnvConstants.URL_APPENV_SERVER) + // ActivityRegister.launch(activity) //Snackbar.make(fab, "后台维护中……", Snackbar.LENGTH_LONG).show() } R.id.nav_about -> { diff --git a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityRegister.kt b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityRegister.kt new file mode 100644 index 0000000..8be4ae9 --- /dev/null +++ b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityRegister.kt @@ -0,0 +1,82 @@ +/* + * Copyright © 2017 Sollyu + * + * 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.view.View +import com.afollestad.materialdialogs.MaterialDialog +import com.alibaba.fastjson.JSON +import com.sollyu.android.appenv.R +import com.sollyu.android.appenv.define.AppEnvConstants +import com.squareup.okhttp.* +import kotlinx.android.synthetic.main.activity_register.* +import kotlinx.android.synthetic.main.include_toolbar.* +import org.xutils.view.annotation.Event +import org.xutils.x +import java.io.IOException + +class ActivityRegister : ActivityBase() { + + companion object { + fun launch(activity: Activity) { + activity.startActivity(Intent(activity, ActivityRegister::class.java)) + } + } + + override fun getMobclickAgentTag(): String { + return "Register" + } + + override fun onInitView() { + super.onInitView() + setContentView(R.layout.activity_register) + x.view().inject(activity) + + setSupportActionBar(toolbar) + supportActionBar?.setTitle(R.string.register_title) + supportActionBar?.setHomeButtonEnabled(true) + supportActionBar?.setDisplayHomeAsUpEnabled(true) + } + + @Suppress("unused") + @Event(R.id.btnLogin) + private fun onItemClickLogin(view: View) { + + val postBody = FormEncodingBuilder() + .add("user_name" , etUserName.text.toString()) + .add("user_password" , etPwd.text.toString()) + .add("user_password_confirm", etPwdConfirm.text.toString()) + .add("user_email" , etEMail.text.toString()) + .build() + + val materialDialog = MaterialDialog.Builder(activity).title(R.string.tip).content(R.string.register_processing).progress(true, 0).cancelable(false).show() + OkHttpClient().newCall(Request.Builder().url(AppEnvConstants.URL_APPENV_REGISTER).post(postBody).build()).enqueue(object : Callback{ + override fun onFailure(request: Request, e: IOException) { + materialDialog.dismiss() + activity.runOnUiThread { MaterialDialog.Builder(activity).title(R.string.error).content(e.message?:"null").show() } + } + + override fun onResponse(response: Response) { + materialDialog.dismiss() + val serverResult = response.body().string() + try { + val resultJsonObject = JSON.parseObject(serverResult) + if (resultJsonObject.getInteger("ret") == 200) { + activity.runOnUiThread { MaterialDialog.Builder(activity).title(R.string.tip).content("注册成功").canceledOnTouchOutside(false).positiveText(android.R.string.ok).onPositive { _, _ -> activity.finish() }.show() } + } else { + activity.runOnUiThread { MaterialDialog.Builder(activity).title(R.string.tip).content("注册失败:\n" + resultJsonObject.getString("msg")).positiveText(android.R.string.ok).show() } + } + } catch (e: Exception) { + activity.runOnUiThread { MaterialDialog.Builder(activity).title(R.string.tip).content("注册失败,原因未知").positiveText(android.R.string.ok).show() } + } + } + }) + } +} diff --git a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityWeb.kt b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityWeb.kt index 616c5ae..d545b6f 100644 --- a/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityWeb.kt +++ b/app/src/main/java/com/sollyu/android/appenv/activitys/ActivityWeb.kt @@ -105,6 +105,12 @@ class ActivityWeb : ActivityBase(), ChromeClientCallbackManager.ReceivedTitleCal inner class JsInterfaceHolder{ + @Suppress("unused") + @JavascriptInterface + fun register() { + ActivityRegister.launch(activity) + } + @Suppress("unused") @JavascriptInterface fun downloadConfig(configId: String, packageName: String, configName: String, packageLabel: String) { diff --git a/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java b/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java index 73996d1..1b8a8bd 100644 --- a/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java +++ b/app/src/main/java/com/sollyu/android/appenv/define/AppEnvConstants.java @@ -20,4 +20,5 @@ public class AppEnvConstants { public static final String URL_APPENV_DOWNLOAD_PACKAGE = URL_APPENV_SERVER + "/api/download/package"; public static final String URL_APPENV_SHARE_START = URL_APPENV_HOST + "/share"; public static final String URL_APPENV_REPORT_PHONE = URL_APPENV_HOST + "/api/phone/report"; + public static final String URL_APPENV_REGISTER = URL_APPENV_HOST + "/api/register"; } diff --git a/app/src/main/res/layout/activity_register.xml b/app/src/main/res/layout/activity_register.xml new file mode 100644 index 0000000..8e971fa --- /dev/null +++ b/app/src/main/res/layout/activity_register.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +