From 9951ffae7a217372fc09bee52afb31ece2428cb0 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Mon, 27 Nov 2017 21:11:49 +0800 Subject: [PATCH] just to save works and use another computer to code --- app/build.gradle | 9 +- app/src/main/AndroidManifest.xml | 16 +- app/src/main/assets/docs/dialogs.html | 145 ++++++++++ app/src/main/assets/docs/http.html | 257 ++++++++++++++++++ .../java/com/stardust/scriptdroid/App.java | 6 +- .../ScriptExecutionIntentService.java | 2 +- .../{CommonUtils.java => ScriptIntents.java} | 37 ++- .../external/open/RunIntentActivity.java | 8 +- .../external/shortcut/ShortcutActivity.java | 4 +- .../external/shortcut/ShortcutManager.java | 3 - .../external/tasker/FireSettingReceiver.java | 6 +- .../external/tasker/TaskPrefEditActivity.java | 16 +- .../external/widget/ScriptWidget.java | 4 +- .../scriptdroid/model/script/Scripts.java | 12 +- .../scriptdroid/timing/TaskReceiver.java | 27 ++ .../timing/TaskSchedulerReceiver.java | 61 +++++ .../scriptdroid/timing/TimedTask.java | 45 +++ .../scriptdroid/timing/TimedTaskManager.java | 58 ++++ .../scriptdroid/timing/TimedTaskService.java | 41 +++ .../ui/common/ScriptOperations.java | 6 +- .../scriptdroid/ui/main/MainActivity.java | 2 +- .../ui/main/scripts/ScriptListView.java | 9 + .../ui/shortcut/ShortcutCreateActivity.java | 8 +- app/src/main/res/menu/menu_script_options.xml | 34 ++- app/src/main/res/values/strings.xml | 2 + autojs/src/main/assets/modules/__images__.js | 5 +- .../autojs/core/image/TemplateMatching.java | 3 +- .../stardust/autojs/runtime/api/Images.java | 17 +- .../java/com/stardust/automator/UiObject.java | 6 +- build.gradle | 3 +- 30 files changed, 780 insertions(+), 72 deletions(-) create mode 100644 app/src/main/assets/docs/dialogs.html create mode 100644 app/src/main/assets/docs/http.html rename app/src/main/java/com/stardust/scriptdroid/external/{CommonUtils.java => ScriptIntents.java} (52%) create mode 100644 app/src/main/java/com/stardust/scriptdroid/timing/TaskReceiver.java create mode 100644 app/src/main/java/com/stardust/scriptdroid/timing/TaskSchedulerReceiver.java create mode 100644 app/src/main/java/com/stardust/scriptdroid/timing/TimedTask.java create mode 100644 app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskManager.java create mode 100644 app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskService.java diff --git a/app/build.gradle b/app/build.gradle index ebbc5118..ece61eb2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,5 +1,4 @@ apply plugin: 'com.android.application' -apply plugin: 'com.getkeepsafe.dexcount' def AAVersion = '4.3.1' android { @@ -9,8 +8,8 @@ android { applicationId "com.stardust.scriptdroid" minSdkVersion 17 targetSdkVersion 23 - versionCode 222 - versionName "3.0.0 Alpha22" + versionCode 223 + versionName "3.0.0 Alpha23" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true ndk { @@ -125,6 +124,10 @@ dependencies { exclude group: 'com.android.support' }) annotationProcessor 'com.github.bumptech.glide:compiler:4.2.0' + //stor + compile 'com.pushtorefresh.storio2:sqlite:2.1.0' + compile 'com.pushtorefresh.storio2:sqlite-annotations:2.1.0' + annotationProcessor 'com.pushtorefresh.storio2:sqlite-annotations-processor:2.1.0' // Tasker Plugin compile 'com.twofortyfouram:android-plugin-client-sdk-for-locale:4.0.3' compile 'com.flurry.android:analytics:7.0.0@aar' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 84f8b428..4acc57f7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -97,7 +97,7 @@ + android:theme="@style/AppTheme.Transparent"/> @@ -206,6 +206,8 @@ + + @@ -216,6 +218,18 @@ android:resource="@xml/script_widget_config"/> + + + + + + + + + + + + + + + + Dialogs | Auto.js 3.0.0 文档 + + + + + + +
+ + +
+
+

Auto.js 3.0.0 文档

+
+

+ 索引 | + 查看全部 +

+
+
+
+ + + +
+

Dialogs#

+
Stability: 2 - Stable

dialogs 模块允许用户通过对话框与脚本进行交互。

+

dialogs.rawInput(title[, default])#

+
    +
  • title <string> 对话框的标题。
  • +
  • default <string> 可选,对话框内输入框的初始内容。默认为 ""
  • +
+

显示一个包含输入框的对话框。如果指定了 default ,那么对话框显示时输入框的内容就为该值。

+

该函数也可通过 rawInput(title[, default])prompt(title[, default]) 或者 dialogs.prompt(title[, default]) 来调用。调用时脚本将阻塞直至对话框被关闭。如果用户输入内容并点击确定,函数将返回输入的内容;否则返回 null

+

dialogs.input(title[, default])#

+

等效于 eval(dialogs.rawInput(title, default))

+

dialogs.prompt(title[, default])#

+

见 dialogs.rawInput

+

dialogs.alert(title[, content])#

+
    +
  • title <string> 对话框的标题。
  • +
  • content <string> 可选,对话框的内容。默认为空。
  • +
+

显示一个只包含“确定”按钮的提示对话框。

+

该函数也可通过 alert(title[, content]) 来调用。调用时脚本将阻塞直至对话框被关闭。该函数无返回值。

+

dialogs.confirm(title[, content])#

+
    +
  • title <string> 对话框的标题。
  • +
  • content <string> 可选,对话框的内容。默认为空。
  • +
+

显示一个包含“确定”和“取消”按钮的提示对话框。

+

该函数也可通过 confirm(title[, content]) 来调用。调用时脚本将阻塞直至对话框被关闭。如果用户点击“确定”则返回 true ,否则返回 false

+

dialogs.select(title, items)#

+
    +
  • title <string> 对话框的标题。
  • +
  • items <Array> 对话框的选项列表,是一个字符串数组。
  • +
+

显示一个带有选项列表的对话框。

+

该函数也可通过 dialogs.select(title, ...items) 来调用。
例如: dialogs.select("标题", ["A", "B", "C"]) 可以用 dialogs.select("标题", "A", "B", "C") 替代。

+

调用时脚本将阻塞直至对话框被关闭。如果用户点击了对话框中的某个选项,该函数会返回该选项的位置(选中第一个选项返回0,第二个选项返回1,以此类推),否则返回-1。

+

dialogs.singleChoice(title, items[, index])#

+
    +
  • title <string> 对话框的标题。
  • +
  • items <Array> 对话框的选项列表,是一个字符串数组。
  • +
  • index <number> 可选,对话框的默认选项的位置。默认为0。
  • +
+

显示一个带有单选框选项列表的对话框。

+

调用时脚本将阻塞直至对话框被关闭。如果用户选中了对话框中的某个选项并点击“确定”,该函数会返回该选项的位置(选中第一个选项返回0,第二个选项返回1,以此类推),否则返回-1。

+

dialogs.multiChoice(title, items[, indexes])#

+
    +
  • title <string> 对话框的标题。
  • +
  • items <Array> 对话框的选项列表,是一个字符串数组。
  • +
  • indexes <Array> 可选,对话框的默认选项的位置数组。默认为空数组。
  • +
+

显示一个带有多选框选项列表的对话框。

+

调用时脚本将阻塞直至对话框被关闭。如果用户点击“确定”按钮,该函数会返回所有已选选项的位置组成的数组,否则返回空数组。

+ +
+
+
+ + + + + + \ No newline at end of file diff --git a/app/src/main/assets/docs/http.html b/app/src/main/assets/docs/http.html new file mode 100644 index 00000000..64b76caa --- /dev/null +++ b/app/src/main/assets/docs/http.html @@ -0,0 +1,257 @@ + + + + + HTTP | Auto.js 3.0.0 文档 + + + + + + +
+ + +
+
+

Auto.js 3.0.0 文档

+
+

+ 索引 | + 查看全部 +

+
+
+
+ + + +
+

HTTP#

+
Stability: 2 - Stable

http模块提供一些进行http请求的函数。

+

http.get(url[, options, callback])#

+
+

对地址url进行一次HTTP GET 请求。如果没有回调函数,则在请求完成或失败时返回此次请求的响应(参见[Response][])。

+

最简单GET请求如下:

+
console.show();
+var r = http.get("www.baidu.com");
+log("code = " + r.statusCode);
+log("html = " + r.body.string());
+

采用回调形式的GET请求如下:

+
console.show();
+http.get("www.baidu.com", {}, function(res, err){
+    if(err){
+        console.error(err);
+        return;
+    }
+    log("code = " + r.statusCode);
+    log("html = " + r.body.string());
+});
+

如果要增加HTTP头部信息,则在options参数中添加,例如:

+
console.show();
+var r = http.get("www.baidu.com", {
+    headers: {
+        "Accept-Language": "zh-cn,zh;q=0.5",
+        "User-Agent: "Mozilla/5.0 (Macintosh; Intel Mac OS X
+10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56
+Safari/535.11"
+    }
+});
+log("code = " + r.statusCode);
+log("html = " + r.body.string());
+

一个请求天气并解析返回的天气JSON结果的例子如下:

+
var city = "广州";
+var res = http.get("http://www.sojson.com/open/api/weather/json.shtml?city=" + city);
+if(res.statusCode != 200){
+    toast("请求失败: " + res.statusCode + " " + res.statusMessage);
+}else{
+    var weather = res.body.json();
+    log(weather);
+    toast(util.format("温度: %s 湿度: %s 空气质量: %s", weather.data.wendu,
+        weather.data.shidu, weather.quality));
+}
+

http.post(url, data[, options, callback])#

+
+

对地址url进行一次HTTP POST 请求。如果没有回调函数,则在请求完成或失败时返回此次请求的响应(参见[Response][])。

+

其中POST数据可以是字符串或键值对。具体含义取决于options.contentType的值。默认为"application/x-www-form-urlencoded"(表单提交), 这种方式是JQuery的ajax函数的默认方式。

+

一个模拟表单提交登录淘宝的例子如下:

+
var url = "https://login.taobao.com/member/login.jhtml";
+var username = "你的用户名";
+var password = "你的密码";
+var res = http.post(url, {
+    "TPL_username": username,
+    "TPL_password": password
+});
+var html = res.body.string();
+if(html.contains("页面跳转中")){
+    toast("登录成功");
+}else{
+    toast("登录失败");
+}
+

http.postJson(url[, data, options, callback])#

+
+

以JSON格式向目标Url发起POST请求。如果没有回调函数,则在请求完成或失败时返回此次请求的响应(参见[Response][])。

+

JSON格式指的是,将会调用JSON.stringify()把data对象转换为JSON字符串,并在HTTP头部信息中把"Content-Type"属性置为"application/json"。这种方式是AngularJS的ajax函数的默认方式。

+

一个调用图灵机器人接口的例子如下:

+

http.request(url[, options, callback])#

+
+

对目标地址url发起一次HTTP请求。如果没有回调函数,则在请求完成或失败时返回此次请求的响应(参见[Response][])。

+

选项options可以包含以下属性:

+ +

该函数是get, post, postJson等函数的基础函数。因此除非是PUT, DELET等请求,或者需要更高定制的HTTP请求,否则直接使用get, post, postJson等函数会更加方便。

+

Response#

+

HTTP请求的响应。

+

Response.statusCode#

+
+

当前响应的HTTP状态码。例如200(OK), 404(Not Found)等。

+

有关HTTP状态码的信息,参见菜鸟教程:HTTP状态码

+

Response.statusMessage#

+
+

当前响应的HTTP状态信息。例如"OK", "Bad Request", "Forbidden"。

+

有关HTTP状态码的信息,参见菜鸟教程:HTTP状态码

+

例子:

+
var res = http.get("www.baidu.com");
+if(res.statusCode >= 200 && res.statusCode < 300){
+    toast("页面获取成功!");
+}else if(res.statusCode == 404){
+    toast("页面没找到哦...");
+}else{
+    toast("错误: " + res.statusCode + " " + res.statusMessage);
+}
+

Response.headers#

+
+

当前响应的HTTP头部信息。该对象的键是响应头名称,值是各自的响应头值。 所有响应头名称都是小写的(吗)。

+

有关HTTP头部信息,参见菜鸟教程:HTTP响应头信息

+

例子:

+
console.show();
+var res = http.get("www.qq.com");
+console.log("HTTP Headers:")
+for(var headerName in res.headers){
+    console.log("%s: %s", headerName, res.headers[headerName]);
+}
+

Response.body#

+
+

当前响应的内容。他有以下属性和函数:

+
    +
  • bytes() <Array> 以字节数组形式返回响应内容
  • +
  • string() <string> 以字符串形式返回响应内容
  • +
  • json() <Object> 把响应内容作为JSON格式的数据并调用JSON.parse,返回解析后的对象
  • +
  • contentType <string> 当前响应的内容类型
  • +
+

Response.request#

+
    +
  • <Request> +当前响应所对应的请求。参见[Request][]。
  • +
+

Response.url#

+
    +
  • <number> +当前响应所对应的请求URL。
  • +
+

Response.method#

+
    +
  • <string> +当前响应所对应的HTTP请求的方法。例如"GET", "POST", "PUT"等。
  • +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/stardust/scriptdroid/App.java b/app/src/main/java/com/stardust/scriptdroid/App.java index dd9a0837..27bbcc87 100644 --- a/app/src/main/java/com/stardust/scriptdroid/App.java +++ b/app/src/main/java/com/stardust/scriptdroid/App.java @@ -1,5 +1,8 @@ package com.stardust.scriptdroid; +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.net.Uri; @@ -17,6 +20,7 @@ import com.stardust.scriptdroid.autojs.AutoJs; import com.stardust.scriptdroid.autojs.key.GlobalKeyObserver; import com.stardust.scriptdroid.autojs.record.GlobalRecorder; import com.stardust.scriptdroid.network.GlideApp; +import com.stardust.scriptdroid.timing.TaskSchedulerReceiver; import com.stardust.scriptdroid.tool.CrashHandler; import com.stardust.scriptdroid.tool.JsBeautifierFactory; import com.stardust.scriptdroid.ui.error.ErrorReportActivity; @@ -74,7 +78,7 @@ public class App extends MultiDexApplication { GlobalKeyObserver.getSingleton(); GlobalRecorder.initSingleton(this); setupDrawableImageLoader(); - + TaskSchedulerReceiver.setupRepeating(this); } private void setupDrawableImageLoader() { diff --git a/app/src/main/java/com/stardust/scriptdroid/external/ScriptExecutionIntentService.java b/app/src/main/java/com/stardust/scriptdroid/external/ScriptExecutionIntentService.java index b80a03f9..58f24ac9 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/ScriptExecutionIntentService.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/ScriptExecutionIntentService.java @@ -18,6 +18,6 @@ public class ScriptExecutionIntentService extends IntentService { protected void onHandleIntent(@Nullable Intent intent) { if (intent == null) return; - CommonUtils.handleIntent(this, intent); + ScriptIntents.handleIntent(this, intent); } } diff --git a/app/src/main/java/com/stardust/scriptdroid/external/CommonUtils.java b/app/src/main/java/com/stardust/scriptdroid/external/ScriptIntents.java similarity index 52% rename from app/src/main/java/com/stardust/scriptdroid/external/CommonUtils.java rename to app/src/main/java/com/stardust/scriptdroid/external/ScriptIntents.java index 1c9fe9aa..756a1f7d 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/CommonUtils.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/ScriptIntents.java @@ -4,12 +4,14 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; +import com.stardust.autojs.execution.ExecutionConfig; import com.stardust.autojs.script.JavaScriptFileSource; import com.stardust.autojs.script.ScriptSource; import com.stardust.autojs.script.SequenceScriptSource; import com.stardust.autojs.script.StringScriptSource; +import com.stardust.scriptdroid.autojs.AutoJs; +import com.stardust.scriptdroid.io.StorageFileProvider; import com.stardust.scriptdroid.model.script.PathChecker; -import com.stardust.scriptdroid.model.script.Scripts; import java.io.File; @@ -17,21 +19,27 @@ import java.io.File; * Created by Stardust on 2017/4/1. */ -public class CommonUtils { +public class ScriptIntents { public static final String EXTRA_KEY_PATH = "path"; - public static final String EXTRA_KEY_PRE_EXECUTE_SCRIPT = "script"; + public static final String EXTRA_KEY_LOOP_TIMES = "loop"; + public static final String EXTRA_KEY_LOOP_INTERVAL = "interval"; + public static final String EXTRA_KEY_DELAY = "delay"; + public static boolean isTaskerBundleValid(Bundle bundle) { - return bundle.containsKey(CommonUtils.EXTRA_KEY_PATH) || bundle.containsKey(EXTRA_KEY_PRE_EXECUTE_SCRIPT); + return bundle.containsKey(ScriptIntents.EXTRA_KEY_PATH) || bundle.containsKey(EXTRA_KEY_PRE_EXECUTE_SCRIPT); } - public static void handleIntent(Context context, Intent intent) { + public static boolean handleIntent(Context context, Intent intent) { String path = getPath(intent); - String directoryPath = null; - String script = intent.getStringExtra(CommonUtils.EXTRA_KEY_PRE_EXECUTE_SCRIPT); + String script = intent.getStringExtra(ScriptIntents.EXTRA_KEY_PRE_EXECUTE_SCRIPT); + int loopTimes = intent.getIntExtra(EXTRA_KEY_LOOP_TIMES, 1); + long delay = intent.getLongExtra(EXTRA_KEY_DELAY, 0); + long interval = intent.getLongExtra(EXTRA_KEY_LOOP_INTERVAL, 0); ScriptSource source = null; + ExecutionConfig config = new ExecutionConfig().loop(delay, loopTimes, interval); if (path == null && script != null) { source = new StringScriptSource(script); } else if (path != null && new PathChecker(context).checkAndToastError(path)) { @@ -41,19 +49,20 @@ public class CommonUtils { } else { source = fileScriptSource; } - directoryPath = new File(path).getParent(); + config.path(new File(path).getParent(), StorageFileProvider.DEFAULT_DIRECTORY_PATH); + } else { + config.path(StorageFileProvider.DEFAULT_DIRECTORY_PATH); } - if (source != null) { - if (directoryPath == null) - Scripts.run(source); - else - Scripts.run(source, directoryPath); + if (source == null) { + return false; } + AutoJs.getInstance().getScriptEngineService().execute(source, config); + return true; } private static String getPath(Intent intent) { if (intent.getData() != null && intent.getData().getPath() != null) return intent.getData().getPath(); - return intent.getStringExtra(CommonUtils.EXTRA_KEY_PATH); + return intent.getStringExtra(ScriptIntents.EXTRA_KEY_PATH); } } diff --git a/app/src/main/java/com/stardust/scriptdroid/external/open/RunIntentActivity.java b/app/src/main/java/com/stardust/scriptdroid/external/open/RunIntentActivity.java index 105ffb4f..20bbcf22 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/open/RunIntentActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/open/RunIntentActivity.java @@ -5,17 +5,13 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.annotation.Nullable; -import android.text.TextUtils; import android.widget.Toast; import com.stardust.autojs.script.StringScriptSource; -import com.stardust.pio.PFile; import com.stardust.pio.PFiles; -import com.stardust.scriptdroid.external.CommonUtils; +import com.stardust.scriptdroid.external.ScriptIntents; import com.stardust.scriptdroid.R; -import com.stardust.scriptdroid.model.script.ScriptFile; import com.stardust.scriptdroid.model.script.Scripts; -import com.stardust.scriptdroid.ui.common.ScriptOperations; import java.io.FileNotFoundException; import java.io.InputStream; @@ -44,7 +40,7 @@ public class RunIntentActivity extends Activity { InputStream stream = getContentResolver().openInputStream(uri); Scripts.run(new StringScriptSource(PFiles.read(stream))); } else { - CommonUtils.handleIntent(this, intent); + ScriptIntents.handleIntent(this, intent); } } } diff --git a/app/src/main/java/com/stardust/scriptdroid/external/shortcut/ShortcutActivity.java b/app/src/main/java/com/stardust/scriptdroid/external/shortcut/ShortcutActivity.java index 4fb8f53b..5fff7402 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/shortcut/ShortcutActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/shortcut/ShortcutActivity.java @@ -5,7 +5,7 @@ import android.os.Bundle; import android.widget.Toast; import com.stardust.scriptdroid.model.script.PathChecker; -import com.stardust.scriptdroid.external.CommonUtils; +import com.stardust.scriptdroid.external.ScriptIntents; import com.stardust.scriptdroid.model.script.ScriptFile; import com.stardust.scriptdroid.model.script.Scripts; @@ -17,7 +17,7 @@ public class ShortcutActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - final String path = getIntent().getStringExtra(CommonUtils.EXTRA_KEY_PATH); + final String path = getIntent().getStringExtra(ScriptIntents.EXTRA_KEY_PATH); if (new PathChecker(this).checkAndToastError(path)) { runScriptFile(path); } diff --git a/app/src/main/java/com/stardust/scriptdroid/external/shortcut/ShortcutManager.java b/app/src/main/java/com/stardust/scriptdroid/external/shortcut/ShortcutManager.java index c12ce22a..be79980f 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/shortcut/ShortcutManager.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/shortcut/ShortcutManager.java @@ -1,6 +1,5 @@ package com.stardust.scriptdroid.external.shortcut; -import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.content.pm.ShortcutInfo; @@ -8,8 +7,6 @@ import android.graphics.drawable.Icon; import android.os.Build; import android.support.annotation.RequiresApi; -import com.stardust.scriptdroid.external.CommonUtils; - import java.util.Collections; import java.util.List; diff --git a/app/src/main/java/com/stardust/scriptdroid/external/tasker/FireSettingReceiver.java b/app/src/main/java/com/stardust/scriptdroid/external/tasker/FireSettingReceiver.java index 5a8acac9..53744734 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/tasker/FireSettingReceiver.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/tasker/FireSettingReceiver.java @@ -5,9 +5,7 @@ import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; -import com.stardust.scriptdroid.App; -import com.stardust.scriptdroid.external.CommonUtils; -import com.stardust.scriptdroid.external.ScriptExecutionIntentService; +import com.stardust.scriptdroid.external.ScriptIntents; import com.stardust.scriptdroid.external.open.RunIntentActivity; import com.twofortyfouram.locale.sdk.client.receiver.AbstractPluginSettingReceiver; @@ -21,7 +19,7 @@ public class FireSettingReceiver extends AbstractPluginSettingReceiver { @Override protected boolean isBundleValid(@NonNull Bundle bundle) { - return CommonUtils.isTaskerBundleValid(bundle); + return ScriptIntents.isTaskerBundleValid(bundle); } @Override diff --git a/app/src/main/java/com/stardust/scriptdroid/external/tasker/TaskPrefEditActivity.java b/app/src/main/java/com/stardust/scriptdroid/external/tasker/TaskPrefEditActivity.java index 331be673..f13928b9 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/tasker/TaskPrefEditActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/tasker/TaskPrefEditActivity.java @@ -9,7 +9,7 @@ import android.view.Menu; import android.view.MenuItem; import com.stardust.scriptdroid.R; -import com.stardust.scriptdroid.external.CommonUtils; +import com.stardust.scriptdroid.external.ScriptIntents; import com.stardust.scriptdroid.model.script.ScriptFile; import com.stardust.scriptdroid.io.StorageFileProvider; import com.stardust.scriptdroid.ui.BaseActivity; @@ -79,30 +79,30 @@ public class TaskPrefEditActivity extends AbstractAppCompatPluginActivity { @Override public boolean isBundleValid(@NonNull Bundle bundle) { - return CommonUtils.isTaskerBundleValid(bundle); + return ScriptIntents.isTaskerBundleValid(bundle); } @Override public void onPostCreateWithPreviousResult(@NonNull Bundle bundle, @NonNull String s) { - mSelectedScriptFilePath = bundle.getString(CommonUtils.EXTRA_KEY_PATH); - mPreExecuteScript = bundle.getString(CommonUtils.EXTRA_KEY_PRE_EXECUTE_SCRIPT); + mSelectedScriptFilePath = bundle.getString(ScriptIntents.EXTRA_KEY_PATH); + mPreExecuteScript = bundle.getString(ScriptIntents.EXTRA_KEY_PRE_EXECUTE_SCRIPT); } @Nullable @Override public Bundle getResultBundle() { Bundle bundle = new Bundle(); - bundle.putString(CommonUtils.EXTRA_KEY_PATH, mSelectedScriptFilePath); - bundle.putString(CommonUtils.EXTRA_KEY_PRE_EXECUTE_SCRIPT, mPreExecuteScript); + bundle.putString(ScriptIntents.EXTRA_KEY_PATH, mSelectedScriptFilePath); + bundle.putString(ScriptIntents.EXTRA_KEY_PRE_EXECUTE_SCRIPT, mPreExecuteScript); return bundle; } @NonNull @Override public String getResultBlurb(@NonNull Bundle bundle) { - String blurb = bundle.getString(CommonUtils.EXTRA_KEY_PATH); + String blurb = bundle.getString(ScriptIntents.EXTRA_KEY_PATH); if (TextUtils.isEmpty(blurb)) { - blurb = bundle.getString(CommonUtils.EXTRA_KEY_PRE_EXECUTE_SCRIPT); + blurb = bundle.getString(ScriptIntents.EXTRA_KEY_PRE_EXECUTE_SCRIPT); } if (TextUtils.isEmpty(blurb)) { blurb = getString(R.string.text_path_is_empty); diff --git a/app/src/main/java/com/stardust/scriptdroid/external/widget/ScriptWidget.java b/app/src/main/java/com/stardust/scriptdroid/external/widget/ScriptWidget.java index 12896554..f33adc2c 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/widget/ScriptWidget.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/widget/ScriptWidget.java @@ -11,7 +11,7 @@ import android.widget.RemoteViews; import com.stardust.pio.PFiles; import com.stardust.scriptdroid.R; -import com.stardust.scriptdroid.external.CommonUtils; +import com.stardust.scriptdroid.external.ScriptIntents; import com.stardust.scriptdroid.external.open.RunIntentActivity; import java.util.HashSet; @@ -48,7 +48,7 @@ public class ScriptWidget extends AppWidgetProvider { RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_script_shortcut); views.setOnClickPendingIntent(R.id.widget, PendingIntent.getActivity(context, requestCode, new Intent(context, RunIntentActivity.class) - .putExtra(CommonUtils.EXTRA_KEY_PATH, path) + .putExtra(ScriptIntents.EXTRA_KEY_PATH, path) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK), PendingIntent.FLAG_UPDATE_CURRENT)); views.setTextViewText(R.id.name, name); appWidgetManager.updateAppWidget(widgetId, views); diff --git a/app/src/main/java/com/stardust/scriptdroid/model/script/Scripts.java b/app/src/main/java/com/stardust/scriptdroid/model/script/Scripts.java index 35d2e322..5a3062c3 100644 --- a/app/src/main/java/com/stardust/scriptdroid/model/script/Scripts.java +++ b/app/src/main/java/com/stardust/scriptdroid/model/script/Scripts.java @@ -13,7 +13,7 @@ import com.stardust.autojs.script.ScriptSource; import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.autojs.AutoJs; -import com.stardust.scriptdroid.external.CommonUtils; +import com.stardust.scriptdroid.external.ScriptIntents; import com.stardust.scriptdroid.external.shortcut.Shortcut; import com.stardust.scriptdroid.external.shortcut.ShortcutActivity; import com.stardust.scriptdroid.io.StorageFileProvider; @@ -77,7 +77,7 @@ public class Scripts { new Shortcut(App.getApp()).name(scriptFile.getSimplifiedName()) .targetClass(ShortcutActivity.class) .iconRes(R.drawable.ic_node_js_black) - .extras(new Intent().putExtra(CommonUtils.EXTRA_KEY_PATH, scriptFile.getPath())) + .extras(new Intent().putExtra(ScriptIntents.EXTRA_KEY_PATH, scriptFile.getPath())) .send(); } @@ -133,4 +133,12 @@ public class Scripts { } return null; } + + public static void send(ScriptFile file) { + Uri uri = Uri.parse("file://" + file.getPath()); + App.getApp().startActivity(new Intent(Intent.ACTION_SEND) + .setDataAndType(uri, "text/plain") + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + + } } diff --git a/app/src/main/java/com/stardust/scriptdroid/timing/TaskReceiver.java b/app/src/main/java/com/stardust/scriptdroid/timing/TaskReceiver.java new file mode 100644 index 00000000..dcba453c --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/timing/TaskReceiver.java @@ -0,0 +1,27 @@ +package com.stardust.scriptdroid.timing; + + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +import com.stardust.scriptdroid.external.ScriptIntents; + +/** + * Created by Stardust on 2017/11/27. + */ + +public class TaskReceiver extends BroadcastReceiver { + + public static final String ACTION_TASK = "com.stardust.autojs.action.task"; + public static final String EXTRA_TASK_ID = "task_id"; + + @Override + public void onReceive(Context context, Intent intent) { + ScriptIntents.handleIntent(context, intent); + int id = intent.getIntExtra(EXTRA_TASK_ID, -1); + if (id >= 0) { + TimedTaskManager.getInstance().notifyTaskFinished(id); + } + } +} diff --git a/app/src/main/java/com/stardust/scriptdroid/timing/TaskSchedulerReceiver.java b/app/src/main/java/com/stardust/scriptdroid/timing/TaskSchedulerReceiver.java new file mode 100644 index 00000000..70275580 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/timing/TaskSchedulerReceiver.java @@ -0,0 +1,61 @@ +package com.stardust.scriptdroid.timing; + +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.util.Log; + +import java.util.concurrent.TimeUnit; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + + +/** + * Created by Stardust on 2017/11/27. + */ + +public class TaskSchedulerReceiver extends BroadcastReceiver { + + public static final String ACTION_CHECK_TASK = "com.stardust.autojs.action.check_task"; + private static final String LOG_TAG = "TaskSchedulerReceiver"; + private static final int REQUEST_CODE = 4056; + private static final long INTERVAL = 60 * 1000; + + @Override + public void onReceive(Context context, Intent intent) { + Log.d(LOG_TAG, "onReceive"); + checkTasks(context); + } + + public static void checkTasks(Context context) { + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + TimedTaskManager.getInstance().getFutureTasksInMillis(TimeUnit.HOURS.toMillis(1)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(timedTask -> scheduleTask(context, alarmManager, timedTask)); + } + + private static void scheduleTask(Context context, AlarmManager alarmManager, TimedTask timedTask) { + long millis = timedTask.getNextTime(); + PendingIntent op = PendingIntent.getBroadcast(context, REQUEST_CODE + 1 + timedTask.getId(), + timedTask.createIntent().setAction(TaskReceiver.ACTION_TASK), + PendingIntent.FLAG_UPDATE_CURRENT); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + alarmManager.setExact(AlarmManager.RTC_WAKEUP, millis, op); + } else { + alarmManager.set(AlarmManager.RTC_WAKEUP, millis, op); + } + + } + + public static void setupRepeating(Context context) { + AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); + alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, + INTERVAL, PendingIntent.getBroadcast(context, REQUEST_CODE, + new Intent(TaskSchedulerReceiver.ACTION_CHECK_TASK), PendingIntent.FLAG_UPDATE_CURRENT)); + } +} diff --git a/app/src/main/java/com/stardust/scriptdroid/timing/TimedTask.java b/app/src/main/java/com/stardust/scriptdroid/timing/TimedTask.java new file mode 100644 index 00000000..77fbe2e3 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/timing/TimedTask.java @@ -0,0 +1,45 @@ +package com.stardust.scriptdroid.timing; + +import android.content.Intent; + + +/** + * Created by Stardust on 2017/11/27. + */ + +public class TimedTask { + + int mId; + + boolean mDisposable; + + boolean mScheduled; + + public boolean isDisposable() { + return mDisposable; + } + + public void setDisposable(boolean disposable) { + mDisposable = disposable; + } + + public boolean isScheduled() { + return mScheduled; + } + + public void setScheduled(boolean scheduled) { + mScheduled = scheduled; + } + + public long getNextTime() { + return 0; + } + + public int getId() { + return mId; + } + + public Intent createIntent() { + return null; + } +} diff --git a/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskManager.java b/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskManager.java new file mode 100644 index 00000000..6556889a --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskManager.java @@ -0,0 +1,58 @@ +package com.stardust.scriptdroid.timing; + + +import com.pushtorefresh.storio2.sqlite.StorIOSQLite; +import com.pushtorefresh.storio2.sqlite.impl.DefaultStorIOSQLite; +import com.pushtorefresh.storio2.sqlite.queries.Query; + +import io.reactivex.Observable; + +/** + * Created by Stardust on 2017/11/27. + */ + +public class TimedTaskManager { + + static final String TABLE_NAME = "timed_tasks"; + + private static TimedTaskManager sInstance = new TimedTaskManager(); + private StorIOSQLite mStorIOSQLite; + + public static TimedTaskManager getInstance() { + return sInstance; + } + + public TimedTaskManager() { + /* mStorIOSQLite = DefaultStorIOSQLite.builder() + .sqliteOpenHelper() + .build();*/ + } + + public void notifyTaskFinished(int id) { + getTaskById(id).subscribe(timedTask -> { + if (timedTask.isDisposable()) { + removeTask(id); + } else { + + } + }); + } + + private Observable getTaskById(int id) { + return null; + } + + private void removeTask(int id) { + } + + + public Observable getAllTasks() { + return null; + } + + public Observable getFutureTasksInMillis(long millis) { + long current = System.currentTimeMillis(); + return getAllTasks().filter(timedTask -> + timedTask.getNextTime() - current <= millis); + } +} diff --git a/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskService.java b/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskService.java new file mode 100644 index 00000000..46651feb --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskService.java @@ -0,0 +1,41 @@ +package com.stardust.scriptdroid.timing; + +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.app.Service; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.os.IBinder; +import android.support.annotation.Nullable; +import android.util.Log; + +/** + * Created by Stardust on 2017/11/27. + */ + +public class TimedTaskService extends Service { + + private static final int REQUEST_CODE_CHECK_TASK = 4056; + + private AlarmManager mAlarmManager; + + @Override + public void onCreate() { + super.onCreate(); + + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public void onDestroy() { + super.onDestroy(); + } + +} diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/common/ScriptOperations.java b/app/src/main/java/com/stardust/scriptdroid/ui/common/ScriptOperations.java index 247d0f42..365e63ac 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/common/ScriptOperations.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/common/ScriptOperations.java @@ -306,6 +306,10 @@ public class ScriptOperations { .show(); } + public void timedTask(ScriptFile scriptFile) { + + } + private class InputCallback implements MaterialDialog.InputCallback { @@ -322,7 +326,7 @@ public class ScriptOperations { this(ext, null); } - public InputCallback() { + InputCallback() { this(null); } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java index 471ed4f4..6f7aa51d 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java @@ -26,7 +26,7 @@ import com.stardust.scriptdroid.BuildConfig; import com.stardust.scriptdroid.Pref; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.autojs.AutoJs; -import com.stardust.scriptdroid.ui.codegeneration.CodeGenerateDialog; +import com.stardust.scriptdroid.timing.TimedTaskService; import com.stardust.scriptdroid.ui.common.NotAskAgainDialog; import com.stardust.scriptdroid.ui.doc.OnlineDocsFragment_; import com.stardust.scriptdroid.ui.floating.FloatyWindowManger; diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/scripts/ScriptListView.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/scripts/ScriptListView.java index fc51465d..97a2a646 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/scripts/ScriptListView.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/scripts/ScriptListView.java @@ -234,6 +234,15 @@ public class ScriptListView extends SwipeRefreshLayout implements SwipeRefreshLa Scripts.openByOtherApps(mSelectedScriptFile); notifyOperated(); break; + case R.id.send: + Scripts.send(mSelectedScriptFile); + notifyOperated(); + break; + case R.id.timed_task: + new ScriptOperations(getContext(), this) + .timedTask(mSelectedScriptFile); + notifyOperated(); + break; case R.id.action_sort_by_date: sort(ScriptList.SORT_TYPE_DATE, mDirSortMenuShowing); break; diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/shortcut/ShortcutCreateActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/shortcut/ShortcutCreateActivity.java index 445ea137..0f44ce1c 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/shortcut/ShortcutCreateActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/shortcut/ShortcutCreateActivity.java @@ -18,7 +18,7 @@ import android.widget.ImageView; import android.widget.TextView; import com.stardust.scriptdroid.R; -import com.stardust.scriptdroid.external.CommonUtils; +import com.stardust.scriptdroid.external.ScriptIntents; import com.stardust.scriptdroid.external.shortcut.Shortcut; import com.stardust.scriptdroid.external.shortcut.ShortcutActivity; import com.stardust.scriptdroid.external.shortcut.ShortcutManager; @@ -100,7 +100,7 @@ public class ShortcutCreateActivity extends AppCompatActivity { } shortcut.name(mName.getText().toString()) .targetClass(ShortcutActivity.class) - .extras(new Intent().putExtra(CommonUtils.EXTRA_KEY_PATH, mScriptFile.getPath())) + .extras(new Intent().putExtra(ScriptIntents.EXTRA_KEY_PATH, mScriptFile.getPath())) .send(); } @@ -114,10 +114,10 @@ public class ShortcutCreateActivity extends AppCompatActivity { icon = Icon.createWithBitmap(bitmap); } PersistableBundle extras = new PersistableBundle(1); - extras.putString(CommonUtils.EXTRA_KEY_PATH, mScriptFile.getPath()); + extras.putString(ScriptIntents.EXTRA_KEY_PATH, mScriptFile.getPath()); ShortcutManager.getInstance(this).addDynamicShortcut(mName.getText(), mScriptFile.getPath(), icon, new Intent(this, ShortcutActivity.class) - .putExtra(CommonUtils.EXTRA_KEY_PATH, mScriptFile.getPath()) + .putExtra(ScriptIntents.EXTRA_KEY_PATH, mScriptFile.getPath()) .setAction(Intent.ACTION_MAIN)); } diff --git a/app/src/main/res/menu/menu_script_options.xml b/app/src/main/res/menu/menu_script_options.xml index 3b23c9d5..b47a73da 100644 --- a/app/src/main/res/menu/menu_script_options.xml +++ b/app/src/main/res/menu/menu_script_options.xml @@ -12,15 +12,33 @@ - - + android:id="@+id/send" + android:title="@string/text_send"/> + + + + + + + + + + + + + + + + \ 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 6d61681e..a48c192d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -312,4 +312,6 @@ 生成失败了o(╥﹏╥)o key_documentation_source 文档源 + 发送 + 定时运行 diff --git a/autojs/src/main/assets/modules/__images__.js b/autojs/src/main/assets/modules/__images__.js index 16bba26e..dd1e6e6e 100644 --- a/autojs/src/main/assets/modules/__images__.js +++ b/autojs/src/main/assets/modules/__images__.js @@ -85,10 +85,11 @@ module.exports = function(__runtime__, scope){ options = options || {}; var threshold = options.threshold || 0.9; var maxLevel = options.level || -1; + var weakThreshold = options.weakThreshold || 0.7; if(options.region){ - return rtImages.findImage(img, template, threshold, buildRegion(options, img), maxLevel); + return rtImages.findImage(img, template, weakThreshold, threshold, buildRegion(options, img), maxLevel); }else{ - return rtImages.findImage(img, template, threshold, null, maxLevel); + return rtImages.findImage(img, template, weakThreshold, threshold, null, maxLevel); } } diff --git a/autojs/src/main/java/com/stardust/autojs/core/image/TemplateMatching.java b/autojs/src/main/java/com/stardust/autojs/core/image/TemplateMatching.java index f432550e..05053888 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/image/TemplateMatching.java +++ b/autojs/src/main/java/com/stardust/autojs/core/image/TemplateMatching.java @@ -26,9 +26,10 @@ public class TemplateMatching { private static final String LOG_TAG = "TemplateMatching"; public static final int MAX_LEVEL_AUTO = -1; + public static final int MATCHING_METHOD_DEFAULT = Imgproc.TM_CCOEFF_NORMED; public static Point fastTemplateMatching(Mat img, Mat template, float threshold) { - return fastTemplateMatching(img, template, Imgproc.TM_CCOEFF_NORMED, 0.75f, threshold, MAX_LEVEL_AUTO); + return fastTemplateMatching(img, template, MATCHING_METHOD_DEFAULT, 0.75f, threshold, MAX_LEVEL_AUTO); } public static Point fastTemplateMatching(Mat img, Mat template, int matchMethod, float weakThreshold, float strictThreshold, int maxLevel) { diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Images.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Images.java index 7bfce2db..1ca37957 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/Images.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Images.java @@ -51,6 +51,8 @@ public class Images { private ScreenCapturer mScreenCapturer; private Context mContext; private Display mDisplay; + private Image mPreCapture; + private ImageWrapper mPreCaptureImage; @ScriptVariable public final ColorFinder colorFinder; @@ -102,7 +104,13 @@ public class Images { if (mScreenCapturer == null) { throw new SecurityException("No screen capture permission"); } - return ImageWrapper.ofImage(mScreenCapturer.capture()); + Image capture = mScreenCapturer.capture(); + if (capture == mPreCapture) { + return mPreCaptureImage; + } + mPreCapture = capture; + mPreCaptureImage = ImageWrapper.ofImage(capture); + return mPreCaptureImage; } @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) @@ -195,15 +203,16 @@ public class Images { } public Point findImage(ImageWrapper image, ImageWrapper template, float threshold, Rect rect) { - return findImage(image, template, threshold, rect, TemplateMatching.MAX_LEVEL_AUTO); + return findImage(image, template, 0.7f, threshold, rect, TemplateMatching.MAX_LEVEL_AUTO); } - public Point findImage(ImageWrapper image, ImageWrapper template, float threshold, Rect rect, int maxLevel) { + public Point findImage(ImageWrapper image, ImageWrapper template, float weakThreshold, float threshold, Rect rect, int maxLevel) { Mat src = image.getMat(); if (rect != null) { src = new Mat(src, rect); } - org.opencv.core.Point point = TemplateMatching.fastTemplateMatching(src, template.getMat(), threshold); + org.opencv.core.Point point = TemplateMatching.fastTemplateMatching(src, template.getMat(), TemplateMatching.MATCHING_METHOD_DEFAULT, + weakThreshold, threshold, maxLevel); if (point != null && rect != null) { point.x += rect.x; point.y += rect.y; diff --git a/automator/src/main/java/com/stardust/automator/UiObject.java b/automator/src/main/java/com/stardust/automator/UiObject.java index faff173a..a8bcff33 100644 --- a/automator/src/main/java/com/stardust/automator/UiObject.java +++ b/automator/src/main/java/com/stardust/automator/UiObject.java @@ -144,11 +144,13 @@ public class UiObject extends AccessibilityNodeInfoCompat { } public String className() { - return getClassName().toString(); + CharSequence d = getClassName(); + return d == null ? null : d.toString(); } public String packageName() { - return getPackageName().toString(); + CharSequence d = getPackageName(); + return d == null ? null : d.toString(); } public int depth() { diff --git a/build.gradle b/build.gradle index 48440800..87c3cfd6 100644 --- a/build.gradle +++ b/build.gradle @@ -6,8 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.0.0' - classpath 'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.6.4' + classpath 'com.android.tools.build:gradle:3.0.1' } }