From 5640b476638c2f6c301ffa2750b322957c2ec91c Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Fri, 3 Feb 2017 10:41:23 +0800 Subject: [PATCH] add: about page, settings, notification switch --- .idea/misc.xml | 5 +- app/build.gradle | 17 +-- app/src/main/AndroidManifest.xml | 83 +++++++++- .../main/assets/sample_hello_big_sister.js | 4 + .../main/assets/sample_open_wechat_moment.js | 6 +- .../stardust/EditAndRunIntentActivity.java | 29 ++++ .../com/stardust/UIActionPerformActivity.java | 17 ++- .../stardust/scriptdroid/AboutActivity.java | 89 +++++++++++ .../java/com/stardust/scriptdroid/App.java | 3 + .../scriptdroid/AssistModeSwitchService.java | 53 +++++++ .../stardust/scriptdroid/BaseActivity.java | 7 +- .../scriptdroid/ErrorReportActivity.java | 100 ++++++++++++ .../scriptdroid/ImportIntentActivity.java | 48 ++++++ .../stardust/scriptdroid/MainActivity.java | 52 +++---- .../scriptdroid/NonUiInitializer.java | 4 +- .../scriptdroid/SettingsActivity.java | 99 ++++++++++++ .../com/stardust/scriptdroid/droid/Droid.java | 4 +- .../droid/runtime/DroidRuntime.java | 8 +- .../runtime/action/ActionPerformService.java | 6 + .../droid/script/DuktapeJavaScriptEngine.java | 119 +++++++++++---- .../script/GBJDuktapeJavaScriptEngine.java | 120 --------------- .../scriptdroid/tool/BackPressedHandler.java | 40 +++++ .../stardust/scriptdroid/tool/IntentTool.java | 48 ++++++ .../ui/AssistModeSwitchNotification.java | 83 ++++++++++ .../scriptdroid/ui/SlideMenuFragment.java | 102 ++++++++----- .../java/com/stardust/util/CrashHandler.java | 47 ++++++ .../java/com/stardust/view/ViewBinder.java | 26 +++- .../java/com/stardust/view/ViewBinding.java | 6 + .../main/res/drawable/ic_developer_512.png | Bin 0 -> 18558 bytes .../main/res/drawable/ic_email_black_48dp.png | Bin 0 -> 425 bytes app/src/main/res/drawable/ic_github_mark.png | Bin 0 -> 7157 bytes app/src/main/res/drawable/ic_money_black.png | Bin 0 -> 4941 bytes .../drawable/ic_notifications_green_48dp.png | Bin 0 -> 1492 bytes app/src/main/res/drawable/ic_qq.png | Bin 0 -> 10369 bytes app/src/main/res/drawable/ic_qq_black.png | Bin 0 -> 16464 bytes .../main/res/drawable/ic_robot_head_green.png | Bin 0 -> 32853 bytes app/src/main/res/drawable/ic_sdcard_black.png | Bin 1897 -> 0 bytes .../main/res/drawable/ic_share_white_48dp.png | Bin 0 -> 938 bytes app/src/main/res/layout/activity_about.xml | 94 ++++++++++++ .../main/res/layout/activity_about_items.xml | 143 ++++++++++++++++++ .../main/res/layout/activity_error_report.xml | 23 +++ app/src/main/res/layout/activity_settings.xml | 28 ++++ app/src/main/res/layout/divider.xml | 7 + .../main/res/layout/fragment_slide_menu.xml | 125 ++++++++------- app/src/main/res/raw/licenses.xml | 19 +++ app/src/main/res/values/strings.xml | 21 ++- app/src/main/res/xml/preferences.xml | 14 ++ 47 files changed, 1392 insertions(+), 307 deletions(-) create mode 100644 app/src/main/assets/sample_hello_big_sister.js create mode 100644 app/src/main/java/com/stardust/EditAndRunIntentActivity.java create mode 100644 app/src/main/java/com/stardust/scriptdroid/AboutActivity.java create mode 100644 app/src/main/java/com/stardust/scriptdroid/AssistModeSwitchService.java create mode 100644 app/src/main/java/com/stardust/scriptdroid/ErrorReportActivity.java create mode 100644 app/src/main/java/com/stardust/scriptdroid/ImportIntentActivity.java create mode 100644 app/src/main/java/com/stardust/scriptdroid/SettingsActivity.java delete mode 100644 app/src/main/java/com/stardust/scriptdroid/droid/script/GBJDuktapeJavaScriptEngine.java create mode 100644 app/src/main/java/com/stardust/scriptdroid/tool/BackPressedHandler.java create mode 100644 app/src/main/java/com/stardust/scriptdroid/tool/IntentTool.java create mode 100644 app/src/main/java/com/stardust/scriptdroid/ui/AssistModeSwitchNotification.java create mode 100644 app/src/main/java/com/stardust/util/CrashHandler.java create mode 100644 app/src/main/res/drawable/ic_developer_512.png create mode 100644 app/src/main/res/drawable/ic_email_black_48dp.png create mode 100644 app/src/main/res/drawable/ic_github_mark.png create mode 100644 app/src/main/res/drawable/ic_money_black.png create mode 100644 app/src/main/res/drawable/ic_notifications_green_48dp.png create mode 100644 app/src/main/res/drawable/ic_qq.png create mode 100644 app/src/main/res/drawable/ic_qq_black.png create mode 100644 app/src/main/res/drawable/ic_robot_head_green.png delete mode 100644 app/src/main/res/drawable/ic_sdcard_black.png create mode 100644 app/src/main/res/drawable/ic_share_white_48dp.png create mode 100644 app/src/main/res/layout/activity_about.xml create mode 100644 app/src/main/res/layout/activity_about_items.xml create mode 100644 app/src/main/res/layout/activity_error_report.xml create mode 100644 app/src/main/res/layout/activity_settings.xml create mode 100644 app/src/main/res/layout/divider.xml create mode 100644 app/src/main/res/xml/preferences.xml diff --git a/.idea/misc.xml b/.idea/misc.xml index 56b4126c..157352a8 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -2,9 +2,10 @@ - + - + + diff --git a/app/build.gradle b/app/build.gradle index c776f33b..5823e9c4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,15 +37,14 @@ repositories { dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') + testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:25.0.0' compile 'com.android.support:design:25.0.0' - testCompile 'junit:junit:4.12' + compile 'com.afollestad.material-dialogs:core:0.9.2.3' compile 'com.google.code.gson:gson:2.8.0' - compile 'com.sothree.slidinguppanel:library:3.3.1' compile('de.psdev.licensesdialog:licensesdialog:1.8.1') - compile 'com.squareup.duktape:duktape-android:1.1.0' compile 'com.furture.react:DuktapeJava:1.1.0' compile 'com.zzhoujay.markdown:markdown:1.0.2' @@ -54,15 +53,9 @@ dependencies { compile 'com.afollestad.material-dialogs:commons:0.9.2.3' compile 'com.makeramen:roundedimageview:2.2.1' compile 'com.rengwuxian.materialedittext:library:2.0.3' - compile(name:'920-common-release', ext:'aar'){ - transitive = true - } - compile(name:'920-styles-debug', ext:'aar'){ - transitive = true - } - compile(name:'920-file_explorer-release', ext:'aar'){ - transitive = true - } + compile(name:'920-common-release', ext:'aar') + compile(name:'920-styles-debug', ext:'aar') + compile(name:'920-file_explorer-release', ext:'aar') compile(name:'920-app-debug', ext:'aar') diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d5e86975..85fc7dc2 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -72,9 +72,90 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/sample_hello_big_sister.js b/app/src/main/assets/sample_hello_big_sister.js new file mode 100644 index 00000000..c478c6ac --- /dev/null +++ b/app/src/main/assets/sample_hello_big_sister.js @@ -0,0 +1,4 @@ +toast("大姐姐好") +for(var i = 0; i < 10; i++){ + toast("大姐姐今年有" + i + "块钱~"); +} \ No newline at end of file diff --git a/app/src/main/assets/sample_open_wechat_moment.js b/app/src/main/assets/sample_open_wechat_moment.js index 82fa1cca..03a71740 100644 --- a/app/src/main/assets/sample_open_wechat_moment.js +++ b/app/src/main/assets/sample_open_wechat_moment.js @@ -1,5 +1,3 @@ launchApp("微信"); -sleep(500); -click("发现"); -sleep(500); -click("朋友圈"); \ No newline at end of file +while(!click("发现")); +while(!click("朋友圈")); \ No newline at end of file diff --git a/app/src/main/java/com/stardust/EditAndRunIntentActivity.java b/app/src/main/java/com/stardust/EditAndRunIntentActivity.java new file mode 100644 index 00000000..2f05de55 --- /dev/null +++ b/app/src/main/java/com/stardust/EditAndRunIntentActivity.java @@ -0,0 +1,29 @@ +package com.stardust; + +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.text.TextUtils; + +import com.stardust.scriptdroid.BaseActivity; +import com.stardust.scriptdroid.EditActivity; + +/** + * Created by Stardust on 2017/2/2. + */ + +public class EditAndRunIntentActivity extends BaseActivity { + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + handleIntent(); + } + + private void handleIntent() { + Intent intent = getIntent(); + String path = intent.getData().getPath(); + if (!TextUtils.isEmpty(path)) + EditActivity.editFile(this, path); + } +} diff --git a/app/src/main/java/com/stardust/UIActionPerformActivity.java b/app/src/main/java/com/stardust/UIActionPerformActivity.java index 2ed00641..25865fda 100644 --- a/app/src/main/java/com/stardust/UIActionPerformActivity.java +++ b/app/src/main/java/com/stardust/UIActionPerformActivity.java @@ -1,5 +1,6 @@ package com.stardust; +import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; @@ -15,9 +16,9 @@ import com.stardust.scriptdroid.droid.runtime.DroidRuntime; public class UIActionPerformActivity extends AppCompatActivity { - private static volatile Runnable action; + private static volatile UIAction action; - public static void performAction(Runnable action) { + public static void performAction(UIAction action) { if (UIActionPerformActivity.action != null) { return; } @@ -30,10 +31,20 @@ public class UIActionPerformActivity extends AppCompatActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); DroidRuntime.setContext(this); - action.run(); + action.setActivity(this).run(); } + public abstract static class UIAction implements Runnable { + + protected Activity mActivity; + + public UIAction setActivity(Activity activity) { + mActivity = activity; + return this; + } + + } } diff --git a/app/src/main/java/com/stardust/scriptdroid/AboutActivity.java b/app/src/main/java/com/stardust/scriptdroid/AboutActivity.java new file mode 100644 index 00000000..58fcc3cb --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/AboutActivity.java @@ -0,0 +1,89 @@ +package com.stardust.scriptdroid; + +import android.content.ClipData; +import android.content.ClipboardManager; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v7.widget.Toolbar; +import android.view.View; +import android.widget.Toast; + +import com.stardust.scriptdroid.tool.IntentTool; +import com.stardust.view.ViewBinder; +import com.stardust.view.ViewBinding; + +/** + * Created by Stardust on 2017/2/2. + */ + +public class AboutActivity extends BaseActivity { + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setUpUI(); + } + + private void setUpUI() { + setContentView(R.layout.activity_about); + setUpToolbar(); + ViewBinder.bind(this); + } + + private void setUpToolbar() { + Toolbar toolbar = $(R.id.toolbar); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + toolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } + + @ViewBinding.Click(R.id.github) + private void openGitHub() { + IntentTool.goToLink(this, getString(R.string.my_github)); + } + + @ViewBinding.Click(R.id.qq) + private void openQQToChatWithMe() { + String qq = getString(R.string.qq); + IntentTool.goToQQ(this, qq); + } + + @ViewBinding.Click(R.id.email) + private void openEmailToSendMe() { + String email = getString(R.string.email); + IntentTool.goToMail(this, email); + } + + + @ViewBinding.Click(R.id.donate) + private void showDonateMeDialog() { + + } + + @ViewBinding.Click(R.id.share) + private void share() { + IntentTool.shareText(this, getString(R.string.share_app)); + } + + @ViewBinding.Click(R.id.icon) + private void lol() { + Toast.makeText(this, "略略略", Toast.LENGTH_LONG).show(); + } + + @ViewBinding.Click(R.id.developer) + private void hhh() { + Toast.makeText(this, "这是软件开发者(。・・)ノ", Toast.LENGTH_LONG).show(); + } + + private void setClipText(CharSequence label, CharSequence text) { + ClipboardManager clipboardManager = (ClipboardManager) getSystemService(CLIPBOARD_SERVICE); + clipboardManager.setPrimaryClip(ClipData.newPlainText(label, text)); + Toast.makeText(this, label + getString(R.string.text_already_copy_to_clip), Toast.LENGTH_SHORT).show(); + } + +} diff --git a/app/src/main/java/com/stardust/scriptdroid/App.java b/app/src/main/java/com/stardust/scriptdroid/App.java index 1d542898..8d2e3d0f 100644 --- a/app/src/main/java/com/stardust/scriptdroid/App.java +++ b/app/src/main/java/com/stardust/scriptdroid/App.java @@ -2,6 +2,8 @@ package com.stardust.scriptdroid; import android.app.Application; +import com.stardust.util.CrashHandler; + /** * Created by Stardust on 2017/1/27. */ @@ -16,6 +18,7 @@ public class App extends Application { public void onCreate() { super.onCreate(); + Thread.setDefaultUncaughtExceptionHandler(new CrashHandler(ErrorReportActivity.class)); instance = this; } } diff --git a/app/src/main/java/com/stardust/scriptdroid/AssistModeSwitchService.java b/app/src/main/java/com/stardust/scriptdroid/AssistModeSwitchService.java new file mode 100644 index 00000000..9e5f4c66 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/AssistModeSwitchService.java @@ -0,0 +1,53 @@ +package com.stardust.scriptdroid; + +import android.app.PendingIntent; +import android.app.Service; +import android.content.Intent; +import android.os.IBinder; +import android.support.annotation.Nullable; + +import com.stardust.scriptdroid.droid.runtime.action.ActionPerformService; +import com.stardust.scriptdroid.ui.AssistModeSwitchNotification; + +/** + * Created by Stardust on 2017/2/2. + */ +public class AssistModeSwitchService extends Service { + + public static PendingIntent getStartIntent() { + Intent intent = new Intent(App.getApp(), AssistModeSwitchService.class) + .putExtra("intentValid", true) + .putExtra("switch", "assistMode"); + return PendingIntent.getService(App.getApp(), 0, intent, 0); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + boolean intentValid = intent.getBooleanExtra("intentValid", false); + if (intentValid) { + String action = intent.getStringExtra("action"); + if (action != null) { + if (action.equals("assistMode")) { + ActionPerformService.setAssistModeEnable(!ActionPerformService.isAssistModeEnable()); + } else { + AssistModeSwitchNotification.setEnable(false); + } + } + } + stopSelf(); + return super.onStartCommand(intent, flags, startId); + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + + public static PendingIntent getDeletePendingIntent() { + Intent deleteIntent = new Intent(App.getApp(), AssistModeSwitchService.class) + .putExtra("intentValid", true) + .putExtra("switch", "assistModeNotification"); + return PendingIntent.getService(App.getApp(), 0, deleteIntent, 0); + } +} diff --git a/app/src/main/java/com/stardust/scriptdroid/BaseActivity.java b/app/src/main/java/com/stardust/scriptdroid/BaseActivity.java index 5786651e..c29b14e5 100644 --- a/app/src/main/java/com/stardust/scriptdroid/BaseActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/BaseActivity.java @@ -6,10 +6,11 @@ import android.support.v7.app.AppCompatActivity; import android.view.View; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; -import java.util.stream.Stream; import static android.content.pm.PackageManager.PERMISSION_DENIED; +import static android.content.pm.PackageManager.PERMISSION_GRANTED; /** * Created by Stardust on 2017/1/23. @@ -30,6 +31,10 @@ public class BaseActivity extends AppCompatActivity { String[] requestPermissions = getRequestPermissions(permissions); if (requestPermissions.length > 0) requestPermissions(requestPermissions, PERMISSION_REQUEST_CODE); + } else { + int[] grantResults = new int[permissions.length]; + Arrays.fill(grantResults, PERMISSION_GRANTED); + onRequestPermissionsResult(PERMISSION_REQUEST_CODE, permissions, grantResults); } } diff --git a/app/src/main/java/com/stardust/scriptdroid/ErrorReportActivity.java b/app/src/main/java/com/stardust/scriptdroid/ErrorReportActivity.java new file mode 100644 index 00000000..f4c1ff98 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/ErrorReportActivity.java @@ -0,0 +1,100 @@ +package com.stardust.scriptdroid; + +import android.content.ClipData; +import android.content.ClipboardManager; +import android.os.Build; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.v7.widget.Toolbar; +import android.widget.Toast; + +import com.afollestad.materialdialogs.DialogAction; +import com.afollestad.materialdialogs.MaterialDialog; + +import java.util.Timer; +import java.util.TimerTask; + +/** + * Created by Stardust on 2017/2/2. + */ + +public class ErrorReportActivity extends BaseActivity { + + protected void onCreate(Bundle savedInstanceState) { + try { + super.onCreate(savedInstanceState); + setUpUI(); + handleIntent(); + + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } + + private void handleIntent() { + String message = getIntent().getStringExtra("message"); + final String errorDetail = getIntent().getStringExtra("error"); + new MaterialDialog.Builder(this) + .content(message) + .positiveText("退出") + .negativeText("复制调试信息") + .onPositive(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { + exit(); + } + }) + .onNegative(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { + copyToClip(getDeviceMessage() + errorDetail); + exitAfter(1000); + } + }) + .cancelable(false) + .show(); + } + + private String getDeviceMessage() { + return "Android: " + Build.VERSION.SDK_INT + "\n"; + } + + private void exitAfter(long millis) { + new Timer().schedule(new TimerTask() { + @Override + public void run() { + exit(); + } + }, millis); + } + + private void copyToClip(String text) { + ((ClipboardManager) getSystemService(CLIPBOARD_SERVICE)) + .setPrimaryClip(ClipData.newPlainText("Debug", text)); + Toast.makeText(ErrorReportActivity.this, R.string.text_already_copy_to_clip, Toast.LENGTH_SHORT).show(); + } + + private void setUpUI() { + setContentView(R.layout.activity_error_report); + setUpToolbar(); + } + + private void setUpToolbar() { + Toolbar toolbar = $(R.id.toolbar); + toolbar.setTitle(getString(R.string.text_error_report)); + setSupportActionBar(toolbar); + getSupportActionBar().setHomeButtonEnabled(false); + } + + private void exit() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + finishAffinity(); + } else { + finish(); + } + + } + +} + + diff --git a/app/src/main/java/com/stardust/scriptdroid/ImportIntentActivity.java b/app/src/main/java/com/stardust/scriptdroid/ImportIntentActivity.java new file mode 100644 index 00000000..4c89d1f0 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/ImportIntentActivity.java @@ -0,0 +1,48 @@ +package com.stardust.scriptdroid; + +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.text.TextUtils; + +import com.afollestad.materialdialogs.MaterialDialog; +import com.stardust.scriptdroid.droid.script.file.ScriptFile; +import com.stardust.scriptdroid.droid.script.file.SharedPrefScriptFileList; + +import java.io.File; + +/** + * Created by Stardust on 2017/2/2. + */ + +public class ImportIntentActivity extends BaseActivity { + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + handleIntent(); + } + + private void handleIntent() { + Intent intent = getIntent(); + final String path = intent.getData().getPath(); + if (!TextUtils.isEmpty(path)) { + new MaterialDialog.Builder(this) + .title(R.string.text_please_input_name) + .input(getString(R.string.text_name), new File(path).getName(), new MaterialDialog.InputCallback() { + @Override + public void onInput(@NonNull MaterialDialog dialog, CharSequence input) { + SharedPrefScriptFileList.getInstance().add(new ScriptFile(input.toString(), path)); + startMainActivity(); + } + }) + .show(); + } + } + + private void startMainActivity() { + startActivity(new Intent(this, MainActivity.class) + .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/stardust/scriptdroid/MainActivity.java b/app/src/main/java/com/stardust/scriptdroid/MainActivity.java index 0ddaabc4..b1bca0cb 100644 --- a/app/src/main/java/com/stardust/scriptdroid/MainActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/MainActivity.java @@ -1,7 +1,6 @@ package com.stardust.scriptdroid; import android.Manifest; -import android.content.ActivityNotFoundException; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; @@ -12,17 +11,17 @@ import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.widget.Toolbar; import android.text.InputType; import android.view.View; -import android.widget.Toast; import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; +import com.afollestad.materialdialogs.folderselector.FileChooserDialog; import com.stardust.app.NotRemindAgainDialog; import com.stardust.scriptdroid.droid.runtime.action.ActionPerformService; import com.stardust.scriptdroid.droid.script.file.ScriptFile; import com.stardust.scriptdroid.droid.script.file.ScriptFileList; import com.stardust.scriptdroid.droid.script.file.SharedPrefScriptFileList; -import com.stardust.scriptdroid.file.FileChooser; import com.stardust.scriptdroid.file.FileUtils; +import com.stardust.scriptdroid.tool.BackPressedHandler; import com.stardust.scriptdroid.ui.ScriptFileOperation; import com.stardust.scriptdroid.ui.ScriptListRecyclerView; import com.stardust.scriptdroid.ui.SlideMenuFragment; @@ -32,22 +31,19 @@ import com.stardust.view.ViewBinding; import com.stardust.view.accessibility.AccessibilityServiceUtils; import java.io.File; -import java.io.InputStream; -public class MainActivity extends BaseActivity { +public class MainActivity extends BaseActivity implements FileChooserDialog.FileCallback { private SlidingUpPanel mAddFilePanel; private ScriptListRecyclerView mScriptListRecyclerView; private ScriptFileList mScriptFileList; - private FileChooser mFileChooser; private DrawerLayout mDrawerLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setUpUI(); - setUpFileChooser(); checkPermissions(); } @@ -72,19 +68,6 @@ public class MainActivity extends BaseActivity { } } - private void setUpFileChooser() { - mFileChooser = new FileChooser(this); - mFileChooser.setOnFileChoseListener(new FileChooser.OnFileChoseListener() { - @Override - public void onFileChose(InputStream inputStream) { - String path = FileUtils.getPath(inputStream); - if (path != null) { - MainActivity.this.addScriptFile(path); - } - } - }); - } - private void addScriptFile(final String path) { new MaterialDialog.Builder(this).title(R.string.text_name) .inputType(InputType.TYPE_CLASS_TEXT) @@ -159,19 +142,14 @@ public class MainActivity extends BaseActivity { @ViewBinding.Click(R.id.import_from_file) private void showFileChooser() { - mFileChooser.startFileManagerToChoose("*/*", new FileChooser.FileManagerNotFoundHandler() { - @Override - public void handle(ActivityNotFoundException exception, String mimeType) { - exception.printStackTrace(); - Snackbar.make(mDrawerLayout, R.string.text_file_manager_not_found, Snackbar.LENGTH_SHORT).show(); - } - }); + new FileChooserDialog.Builder(this) + .extensionsFilter(".js", ".txt") + .show(); } @ViewBinding.Click(R.id.setting) private void startSettingActivity() { - //TODO create Setting Activity - Toast.makeText(this, "暂无", Toast.LENGTH_LONG).show(); + startActivity(new Intent(this, SettingsActivity.class)); } @ViewBinding.Click(R.id.exit) @@ -179,10 +157,6 @@ public class MainActivity extends BaseActivity { super.finish(); } - public void onActivityResult(int requestCode, int resultCode, Intent data) { - mFileChooser.onActivityResult(requestCode, resultCode, data); - } - @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { @@ -191,4 +165,16 @@ public class MainActivity extends BaseActivity { mScriptListRecyclerView.getAdapter().notifyDataSetChanged(); } } + + @Override + public void onFileSelection(@NonNull FileChooserDialog dialog, @NonNull File file) { + addScriptFile(file.getPath()); + } + + + private BackPressedHandler mBackPressedHandler = new BackPressedHandler.DoublePressExit(this); + @Override + public void onBackPressed() { + mBackPressedHandler.onBackPressed(); + } } \ No newline at end of file diff --git a/app/src/main/java/com/stardust/scriptdroid/NonUiInitializer.java b/app/src/main/java/com/stardust/scriptdroid/NonUiInitializer.java index 8d50ced1..503b6d22 100644 --- a/app/src/main/java/com/stardust/scriptdroid/NonUiInitializer.java +++ b/app/src/main/java/com/stardust/scriptdroid/NonUiInitializer.java @@ -18,7 +18,7 @@ public class NonUiInitializer { private static final Map SAMPLES = new MapEntries() .entry("sample_open_wechat_moment.js", R.string.text_sample_open_what_moment) .entry("sample_open_running_services.js", R.string.text_sample_open_running_services) - .entry("sample_simple_calculator.js", R.string.text_sample_simple_calculator) + .entry("sample_hello_big_sister.js", R.string.text_sample_hello_big_sister) .map(); private static NonUiInitializer instance = new NonUiInitializer(); @@ -35,7 +35,7 @@ public class NonUiInitializer { } - public void copySampleScriptFileIfNeeded(){ + public void copySampleScriptFileIfNeeded() { if (!Pref.def().getBoolean(Pref.SAMPLE_SCRIPTS_COPIED, false)) { copySampleScriptFile(); } diff --git a/app/src/main/java/com/stardust/scriptdroid/SettingsActivity.java b/app/src/main/java/com/stardust/scriptdroid/SettingsActivity.java new file mode 100644 index 00000000..66c27ff7 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/SettingsActivity.java @@ -0,0 +1,99 @@ +package com.stardust.scriptdroid; + +import android.content.Intent; +import android.os.Bundle; +import android.preference.Preference; +import android.preference.PreferenceScreen; +import android.support.annotation.Nullable; +import android.support.v7.widget.Toolbar; +import android.view.View; + +import com.stardust.util.MapEntries; + +import java.util.Map; + +import de.psdev.licensesdialog.LicensesDialog; + +/** + * Created by Stardust on 2017/2/2. + */ + +public class SettingsActivity extends BaseActivity { + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setUpUI(); + } + + private void setUpUI() { + setContentView(R.layout.activity_settings); + setUpToolbar(); + getFragmentManager().beginTransaction().replace(R.id.fragment_setting, new PreferenceFragment()).commit(); + } + + private void setUpToolbar() { + Toolbar toolbar = $(R.id.toolbar); + toolbar.setTitle(R.string.text_setting); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + toolbar.setNavigationOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + } + + + public static class PreferenceFragment extends android.preference.PreferenceFragment { + + private Map ACTION_MAP; + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + addPreferencesFromResource(R.xml.preferences); + } + + @Override + public void onStart() { + super.onStart(); + ACTION_MAP = new MapEntries() + .entry(getString(R.string.text_about), new Runnable() { + @Override + public void run() { + startActivity(new Intent(getActivity(), AboutActivity.class)); + } + }) + .entry(getString(R.string.text_licenses), new Runnable() { + @Override + public void run() { + showLicenseDialog(); + } + }) + .map(); + } + + @Override + public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) { + Runnable action = ACTION_MAP.get(preference.getTitle().toString()); + if (action != null) { + action.run(); + return true; + } else { + return super.onPreferenceTreeClick(preferenceScreen, preference); + } + } + + private void showLicenseDialog() { + new LicensesDialog.Builder(getActivity()) + .setNotices(R.raw.licenses) + .setIncludeOwnLicense(true) + .build() + .showAppCompat(); + } + + } +} diff --git a/app/src/main/java/com/stardust/scriptdroid/droid/Droid.java b/app/src/main/java/com/stardust/scriptdroid/droid/Droid.java index e069fd90..52f336f7 100644 --- a/app/src/main/java/com/stardust/scriptdroid/droid/Droid.java +++ b/app/src/main/java/com/stardust/scriptdroid/droid/Droid.java @@ -1,7 +1,7 @@ package com.stardust.scriptdroid.droid; import com.stardust.scriptdroid.droid.runtime.DroidRuntime; -import com.stardust.scriptdroid.droid.script.GBJDuktapeJavaScriptEngine; +import com.stardust.scriptdroid.droid.script.DuktapeJavaScriptEngine; import com.stardust.scriptdroid.droid.script.JavaScriptEngine; import com.stardust.scriptdroid.file.FileUtils; @@ -19,7 +19,7 @@ public class Droid { } private static final DroidRuntime RUNTIME = DroidRuntime.getRuntime(); - private static final JavaScriptEngine JAVA_SCRIPT_ENGINE = new GBJDuktapeJavaScriptEngine(RUNTIME); + private static final JavaScriptEngine JAVA_SCRIPT_ENGINE = new DuktapeJavaScriptEngine(RUNTIME); private static final OnRunFinishedListener DEFAULT_LISTENER = new OnRunFinishedListener() { @Override public void onRunFinished(Object result, Exception e) { diff --git a/app/src/main/java/com/stardust/scriptdroid/droid/runtime/DroidRuntime.java b/app/src/main/java/com/stardust/scriptdroid/droid/runtime/DroidRuntime.java index 3f1b4af7..33f1175b 100644 --- a/app/src/main/java/com/stardust/scriptdroid/droid/runtime/DroidRuntime.java +++ b/app/src/main/java/com/stardust/scriptdroid/droid/runtime/DroidRuntime.java @@ -10,7 +10,6 @@ import android.view.accessibility.AccessibilityNodeInfo; import android.widget.Toast; import com.afollestad.materialdialogs.MaterialDialog; -import com.stardust.UIActionPerformActivity; import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.droid.runtime.action.Action; @@ -194,12 +193,7 @@ public class DroidRuntime implements IDroidRuntime { } public MaterialDialog show(final MaterialDialog.Builder dialog) { - UIActionPerformActivity.performAction(new Runnable() { - @Override - public void run() { - dialog.show(); - } - }); + return null; } } diff --git a/app/src/main/java/com/stardust/scriptdroid/droid/runtime/action/ActionPerformService.java b/app/src/main/java/com/stardust/scriptdroid/droid/runtime/action/ActionPerformService.java index c9bd77b5..c07a9f23 100644 --- a/app/src/main/java/com/stardust/scriptdroid/droid/runtime/action/ActionPerformService.java +++ b/app/src/main/java/com/stardust/scriptdroid/droid/runtime/action/ActionPerformService.java @@ -3,6 +3,7 @@ package com.stardust.scriptdroid.droid.runtime.action; import android.accessibilityservice.AccessibilityService; import android.content.ClipData; import android.content.ClipboardManager; +import android.content.Intent; import android.graphics.Rect; import android.os.Build; import android.preference.PreferenceManager; @@ -27,6 +28,10 @@ import java.util.List; public class ActionPerformService extends AccessibilityService { + + public static final String ACTION_CHANGE_ASSIST_MODE = App.getApp().getPackageName() + ".ACTION_CHANGE_ASSIST_MODE"; + + private static final String TAG = "ActionPerformService"; private static final String KEY_ASSIST_MODE_ENABLE = "ASSIST_MODE_ENABLE"; private static ActionPerformService instance; @@ -65,6 +70,7 @@ public class ActionPerformService extends AccessibilityService { public static void setAssistModeEnable(boolean assistModeEnable) { ActionPerformService.assistModeEnable = assistModeEnable; PreferenceManager.getDefaultSharedPreferences(App.getApp()).edit().putBoolean(KEY_ASSIST_MODE_ENABLE, assistModeEnable).apply(); + App.getApp().sendBroadcast(new Intent(ACTION_CHANGE_ASSIST_MODE).putExtra("enable", assistModeEnable)); } @Override diff --git a/app/src/main/java/com/stardust/scriptdroid/droid/script/DuktapeJavaScriptEngine.java b/app/src/main/java/com/stardust/scriptdroid/droid/script/DuktapeJavaScriptEngine.java index 13500f53..abf4f662 100644 --- a/app/src/main/java/com/stardust/scriptdroid/droid/script/DuktapeJavaScriptEngine.java +++ b/app/src/main/java/com/stardust/scriptdroid/droid/script/DuktapeJavaScriptEngine.java @@ -1,12 +1,19 @@ package com.stardust.scriptdroid.droid.script; -import android.util.Log; +import android.util.Pair; -import com.squareup.duktape.Duktape; +import com.efurture.script.JSTransformer; +import com.furture.react.DuktapeEngine; +import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.droid.runtime.api.IDroidRuntime; -import static com.stardust.scriptdroid.droid.script.JavaScriptEngine.Init.readInitScript; - +import java.io.IOException; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; /** * Created by Stardust on 2017/1/27. @@ -14,54 +21,100 @@ import static com.stardust.scriptdroid.droid.script.JavaScriptEngine.Init.readIn public class DuktapeJavaScriptEngine implements JavaScriptEngine { - private static final String TAG = "DuktapeJavaScriptEngine"; - private Duktape mDuktape = Duktape.create(); - private boolean mRecycled = false; + private final List> mDuktapeEngineList = new ArrayList<>(); + private static final String INIT_SCRIPT; + private Map mVariableMap = new HashMap<>(); + + static { + try { + INIT_SCRIPT = JSTransformer.parse(new StringReader(Init.INIT_SCRIPT)); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } public DuktapeJavaScriptEngine(IDroidRuntime runtime) { setRuntime(runtime); - execute(readInitScript()); + } - public void setRuntime(IDroidRuntime runtime) { + private void setRuntime(IDroidRuntime runtime) { set("droid", IDroidRuntime.class, runtime); } - @Override - public Object execute(String script) { - return mDuktape.evaluate(script); + public Object execute(String script) throws IOException { + DuktapeEngine duktapeEngine = new DuktapeEngine(); + init(duktapeEngine); + add(duktapeEngine, Thread.currentThread()); + Object result; + try { + result = duktapeEngine.execute(JSTransformer.parse(new StringReader(script))); + } catch (IOException e) { + remove(duktapeEngine); + throw e; + } + remove(duktapeEngine); + return result; } + private void init(DuktapeEngine duktapeEngine) { + duktapeEngine.put("context", App.getApp()); + duktapeEngine.execute(INIT_SCRIPT); + for (Map.Entry variable : mVariableMap.entrySet()) { + duktapeEngine.put(variable.getKey(), variable.getValue()); + } + + } + + private void remove(DuktapeEngine duktapeEngine) { + duktapeEngine.destory(); + synchronized (mDuktapeEngineList) { + Iterator> iterator = mDuktapeEngineList.iterator(); + while (iterator.hasNext()) { + Pair pair = iterator.next(); + if (pair.first == duktapeEngine) { + stop(pair.first, pair.second); + } + iterator.remove(); + break; + } + } + } + + private void stop(DuktapeEngine engine, Thread thread) { + try { + thread.interrupt(); + } catch (Exception e) { + e.printStackTrace(); + } + engine.destory(); + } + + private void add(DuktapeEngine duktapeEngine, Thread thread) { + synchronized (mDuktapeEngineList) { + mDuktapeEngineList.add(0, new Pair<>(duktapeEngine, thread)); + } + } + + @Override public void set(String varName, Class c, T value) { - mDuktape.set(varName, c, value); + mVariableMap.put(varName, value); } @Override public int stopAll() { - mDuktape.close(); - return 1; - } - - public void recycle() { - if (!mRecycled) { - mDuktape.close(); - mRecycled = true; - } - } - - @Override - public void finalize() throws Throwable { - try { - if (!mRecycled) { - Log.w(TAG, "Not recycled before finalize"); - recycle(); + int n; + synchronized (mDuktapeEngineList) { + for (Pair pair : mDuktapeEngineList) { + stop(pair.first, pair.second); } - } catch (Throwable throwable) { - throwable.printStackTrace(); + n = mDuktapeEngineList.size(); + mDuktapeEngineList.clear(); } - super.finalize(); + return n; } } diff --git a/app/src/main/java/com/stardust/scriptdroid/droid/script/GBJDuktapeJavaScriptEngine.java b/app/src/main/java/com/stardust/scriptdroid/droid/script/GBJDuktapeJavaScriptEngine.java deleted file mode 100644 index 5d01ada8..00000000 --- a/app/src/main/java/com/stardust/scriptdroid/droid/script/GBJDuktapeJavaScriptEngine.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.stardust.scriptdroid.droid.script; - -import android.util.Pair; - -import com.efurture.script.JSTransformer; -import com.furture.react.DuktapeEngine; -import com.stardust.scriptdroid.App; -import com.stardust.scriptdroid.droid.runtime.api.IDroidRuntime; - -import java.io.IOException; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -/** - * Created by Stardust on 2017/1/27. - */ - -public class GBJDuktapeJavaScriptEngine implements JavaScriptEngine { - - - private final List> mDuktapeEngineList = new ArrayList<>(); - private static final String INIT_SCRIPT; - private Map mVariableMap = new HashMap<>(); - - static { - try { - INIT_SCRIPT = JSTransformer.parse(new StringReader(Init.INIT_SCRIPT)); - } catch (IOException e) { - e.printStackTrace(); - throw new RuntimeException(e); - } - } - - public GBJDuktapeJavaScriptEngine(IDroidRuntime runtime) { - setRuntime(runtime); - - } - - private void setRuntime(IDroidRuntime runtime) { - set("droid", IDroidRuntime.class, runtime); - } - - @Override - public Object execute(String script) throws IOException { - DuktapeEngine duktapeEngine = new DuktapeEngine(); - init(duktapeEngine); - add(duktapeEngine, Thread.currentThread()); - Object result; - try { - result = duktapeEngine.execute(JSTransformer.parse(new StringReader(script))); - } catch (IOException e) { - remove(duktapeEngine); - throw e; - } - remove(duktapeEngine); - return result; - } - - private void init(DuktapeEngine duktapeEngine) { - duktapeEngine.put("context", App.getApp()); - duktapeEngine.execute(INIT_SCRIPT); - for (Map.Entry variable : mVariableMap.entrySet()) { - duktapeEngine.put(variable.getKey(), variable.getValue()); - } - - } - - private void remove(DuktapeEngine duktapeEngine) { - duktapeEngine.destory(); - synchronized (mDuktapeEngineList) { - Iterator> iterator = mDuktapeEngineList.iterator(); - while (iterator.hasNext()) { - Pair pair = iterator.next(); - if (pair.first == duktapeEngine) { - stop(pair.first, pair.second); - } - iterator.remove(); - break; - } - } - } - - private void stop(DuktapeEngine engine, Thread thread) { - try { - thread.interrupt(); - } catch (Exception e) { - e.printStackTrace(); - } - engine.destory(); - } - - private void add(DuktapeEngine duktapeEngine, Thread thread) { - synchronized (mDuktapeEngineList) { - mDuktapeEngineList.add(0, new Pair<>(duktapeEngine, thread)); - } - } - - @Override - public void set(String varName, Class c, T value) { - mVariableMap.put(varName, value); - } - - @Override - public int stopAll() { - int n; - synchronized (mDuktapeEngineList) { - for (Pair pair : mDuktapeEngineList) { - stop(pair.first, pair.second); - } - n = mDuktapeEngineList.size(); - mDuktapeEngineList.clear(); - } - return n; - } - -} diff --git a/app/src/main/java/com/stardust/scriptdroid/tool/BackPressedHandler.java b/app/src/main/java/com/stardust/scriptdroid/tool/BackPressedHandler.java new file mode 100644 index 00000000..e274a0df --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/tool/BackPressedHandler.java @@ -0,0 +1,40 @@ +package com.stardust.scriptdroid.tool; + +import android.app.Activity; +import android.widget.Toast; + +import com.stardust.scriptdroid.R; + +/** + * Created by Stardust on 2017/2/3. + */ +public interface BackPressedHandler { + + void onBackPressed(); + + class DoublePressExit implements BackPressedHandler { + + private final Activity mActivity; + private long mLastPressedMillis; + private long mDoublePressInterval = 1000; + + public DoublePressExit(Activity activity) { + mActivity = activity; + } + + public DoublePressExit setDoublePressInterval(long doublePressInterval) { + mDoublePressInterval = doublePressInterval; + return this; + } + + @Override + public void onBackPressed() { + if (System.currentTimeMillis() - mLastPressedMillis < mDoublePressInterval) { + mActivity.finish(); + } else { + mLastPressedMillis = System.currentTimeMillis(); + Toast.makeText(mActivity, R.string.text_press_again_to_exit, Toast.LENGTH_SHORT).show(); + } + } + } +} diff --git a/app/src/main/java/com/stardust/scriptdroid/tool/IntentTool.java b/app/src/main/java/com/stardust/scriptdroid/tool/IntentTool.java new file mode 100644 index 00000000..ce3fe1a3 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/tool/IntentTool.java @@ -0,0 +1,48 @@ +package com.stardust.scriptdroid.tool; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.support.annotation.Nullable; + +/** + * Intent工具,用于Activity之间的跳转,调起其他应用程序等 + */ +public class IntentTool { + + public static void goToQQ(Context context, String qq) { + try { + String url = "mqqwpa://im/chat?chat_type=wpa&uin=" + qq; + context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url))); + } catch (Exception exception) { + exception.printStackTrace(); + } + } + + public static void goToMail(Context context, String sendTo, @Nullable String title, @Nullable String content) { + Uri uri = Uri.parse("mailto:" + sendTo); + String[] email = {sendTo}; + Intent intent = new Intent(Intent.ACTION_SENDTO, uri); + intent.putExtra(Intent.EXTRA_CC, email); + if (title != null) + intent.putExtra(Intent.EXTRA_SUBJECT, title); + if (content != null) + intent.putExtra(Intent.EXTRA_TEXT, content); + context.startActivity(Intent.createChooser(intent, "请选择邮件应用")); + } + + public static void goToMail(Context context, String sendTo) { + goToMail(context, sendTo, null, null); + } + + public static void goToLink(Context context, String link) { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(link)); + context.startActivity(intent); + } + + public static void shareText(Context context, String text) { + context.startActivity(new Intent(Intent.ACTION_SEND) + .putExtra(Intent.EXTRA_TEXT, text) + .setType("text/plain")); + } +} diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/AssistModeSwitchNotification.java b/app/src/main/java/com/stardust/scriptdroid/ui/AssistModeSwitchNotification.java new file mode 100644 index 00000000..22f39687 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/ui/AssistModeSwitchNotification.java @@ -0,0 +1,83 @@ +package com.stardust.scriptdroid.ui; + +import android.app.Notification; +import android.app.NotificationManager; +import android.content.Context; +import android.preference.PreferenceManager; +import android.support.v4.app.NotificationCompat; + +import com.stardust.scriptdroid.App; +import com.stardust.scriptdroid.AssistModeSwitchService; +import com.stardust.scriptdroid.R; +import com.stardust.scriptdroid.droid.runtime.action.ActionPerformService; + +/** + * Created by Stardust on 2017/2/2. + */ + +public class AssistModeSwitchNotification { + + private static final int NOTIFY_ID = 11126; + private static final String KEY_ASSIST_MODE_NOTIFICATION = "KEY_ASSIST_MODE_NOTIFICATION"; + + private static boolean enable = false; + private static Notification notification; + + static { + readPreference(); + } + + public static boolean isEnable() { + return enable; + } + + public static void setEnable(boolean enable) { + if (AssistModeSwitchNotification.enable == enable) + return; + AssistModeSwitchNotification.enable = enable; + PreferenceManager.getDefaultSharedPreferences(App.getApp()).edit().putBoolean(KEY_ASSIST_MODE_NOTIFICATION, enable).apply(); + if (enable) { + showNotification(); + } else { + hideNotification(); + } + } + + public static void notifyAssistModeChanged() { + if (enable) { + setEnable(false); + setEnable(true); + } + } + + + private static void showNotification() { + notification = new NotificationCompat.Builder(App.getApp()) + .setAutoCancel(false) + .setSmallIcon(R.drawable.ic_robot_head) + .setDeleteIntent(AssistModeSwitchService.getDeletePendingIntent()) + .setContentText(ActionPerformService.isAssistModeEnable() ? + App.getApp().getString(R.string.text_assist_mode_enabled) : + App.getApp().getString(R.string.text_assist_mode_disabled)) + .setContentIntent(AssistModeSwitchService.getStartIntent()) + .build(); + showNotification(notification); + } + + private static void showNotification(Notification notification) { + NotificationManager notificationManager = (NotificationManager) App.getApp().getSystemService(Context.NOTIFICATION_SERVICE); + notificationManager.notify(NOTIFY_ID, notification); + } + + private static void hideNotification() { + NotificationManager notificationManager = (NotificationManager) App.getApp().getSystemService(Context.NOTIFICATION_SERVICE); + notificationManager.cancel(NOTIFY_ID); + } + + + private static void readPreference() { + enable = PreferenceManager.getDefaultSharedPreferences(App.getApp()).getBoolean(KEY_ASSIST_MODE_NOTIFICATION, false); + setEnable(enable); + } + +} diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/SlideMenuFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/SlideMenuFragment.java index 6043ef06..ab78b10e 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/SlideMenuFragment.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/SlideMenuFragment.java @@ -1,6 +1,9 @@ package com.stardust.scriptdroid.ui; +import android.content.BroadcastReceiver; +import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; @@ -9,8 +12,6 @@ import android.support.v7.widget.SwitchCompat; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.CompoundButton; -import android.widget.Toast; import com.stardust.app.Fragment; import com.stardust.scriptdroid.DocumentActivity; @@ -21,7 +22,7 @@ import com.stardust.view.ViewBinder; import com.stardust.view.ViewBinding; import com.stardust.view.accessibility.AccessibilityServiceUtils; -import de.psdev.licensesdialog.LicensesDialog; +import static com.stardust.scriptdroid.droid.runtime.action.ActionPerformService.ACTION_CHANGE_ASSIST_MODE; /** * Created by Stardust on 2017/1/30. @@ -35,7 +36,8 @@ public class SlideMenuFragment extends Fragment { activity.getSupportFragmentManager().beginTransaction().replace(viewId, fragment).commit(); } - private SwitchCompat mAutoOperateServiceSwitch; + private SwitchCompat mAutoOperateServiceSwitch, mAssistServiceSwitch, mAssistServiceNotificationSwitch; + private Receiver mReceiver = new Receiver(); @Nullable @Override @@ -49,40 +51,68 @@ public class SlideMenuFragment extends Fragment { if (mAutoOperateServiceSwitch == null) { setUpSwitchCompat(); ViewBinder.bind(this); + IntentFilter filter = new IntentFilter(); + filter.addAction(ACTION_CHANGE_ASSIST_MODE); + getContext().registerReceiver(mReceiver, filter); } - syncSwitchStatus(); + syncSwitchState(); } - private void syncSwitchStatus() { + private void syncSwitchState() { mAutoOperateServiceSwitch.postDelayed(new Runnable() { @Override public void run() { mAutoOperateServiceSwitch.setChecked(ActionPerformService.isEnable()); } }, 450); + mAssistServiceSwitch.setChecked(ActionPerformService.isAssistModeEnable()); + mAssistServiceNotificationSwitch.setChecked(AssistModeSwitchNotification.isEnable()); } private void setUpSwitchCompat() { mAutoOperateServiceSwitch = $(R.id.sw_auto_operate_service); - mAutoOperateServiceSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - if (isChecked && !ActionPerformService.isEnable()) { - AccessibilityServiceUtils.goToPermissionSetting(getContext()); - } else if (!isChecked && ActionPerformService.isEnable()) { - ActionPerformService.disable(); - } - } - }); + mAssistServiceSwitch = $(R.id.sw_assist_service); + mAssistServiceNotificationSwitch = $(R.id.sw_assist_service_notification); } - @ViewBinding.Click(R.id.licenses) - private void showLicenseDialog() { - new LicensesDialog.Builder(getActivity()) - .setNotices(R.raw.licenses) - .setIncludeOwnLicense(true) - .build() - .showAppCompat(); + @ViewBinding.Click(R.id.syntax_and_api) + private void startSyntaxHelpActivity() { + startActivity(new Intent(getContext(), DocumentActivity.class)); + } + + @ViewBinding.Click(R.id.auto_operate_service) + private void clickAutoOperateServiceSwitch() { + mAutoOperateServiceSwitch.toggle(); + } + + @ViewBinding.Check(R.id.sw_auto_operate_service) + private void setAutoOperateServiceEnable(boolean enable) { + if (enable && !ActionPerformService.isEnable()) { + AccessibilityServiceUtils.goToPermissionSetting(getContext()); + } else if (!enable && ActionPerformService.isEnable()) { + ActionPerformService.disable(); + } + } + + @ViewBinding.Check(R.id.sw_assist_service) + private void setAssistServiceEnable(boolean enable) { + ActionPerformService.setAssistModeEnable(enable); + AssistModeSwitchNotification.notifyAssistModeChanged(); + } + + @ViewBinding.Click(R.id.assist_service) + private void toggleAssistServiceSwitch() { + mAssistServiceSwitch.toggle(); + } + + @ViewBinding.Check(R.id.sw_assist_service_notification) + private void setAssistServiceNotificationEnable(boolean enable) { + AssistModeSwitchNotification.setEnable(enable); + } + + @ViewBinding.Click(R.id.assist_service_notification) + private void toggleAssistServiceNotificationSwitch() { + mAssistServiceNotificationSwitch.toggle(); } @ViewBinding.Click(R.id.stop_all_running_scripts) @@ -94,19 +124,23 @@ public class SlideMenuFragment extends Fragment { Snackbar.make(getActivityContentView(), "没有正在运行的脚本", Snackbar.LENGTH_SHORT).show(); } - @ViewBinding.Click(R.id.syntax_and_api) - private void startSyntaxHelpActivity() { - startActivity(new Intent(getContext(), DocumentActivity.class)); + @Override + public void onDestroy() { + getContext().unregisterReceiver(mReceiver); + super.onDestroy(); } - @ViewBinding.Click(R.id.about_app) - private void startAboutActivity() { - // TODO: 2017/1/30 startAboutActivity - Toast.makeText(getContext(), "暂无", Toast.LENGTH_LONG).show(); + private class Receiver extends BroadcastReceiver { + + + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction().equals(ACTION_CHANGE_ASSIST_MODE)) { + AssistModeSwitchNotification.notifyAssistModeChanged(); + mAssistServiceSwitch.setChecked(intent.getBooleanExtra("enable", false)); + } + } } - @ViewBinding.Click(R.id.auto_operate_service) - private void clickAutoOperateServiceSwitch() { - mAutoOperateServiceSwitch.setChecked(!mAutoOperateServiceSwitch.isChecked()); - } + } diff --git a/app/src/main/java/com/stardust/util/CrashHandler.java b/app/src/main/java/com/stardust/util/CrashHandler.java new file mode 100644 index 00000000..9006246d --- /dev/null +++ b/app/src/main/java/com/stardust/util/CrashHandler.java @@ -0,0 +1,47 @@ +package com.stardust.util; + +/** + * Created by Stardust on 2017/2/2. + */ + + +import android.content.Intent; +import android.util.Log; + +import com.stardust.scriptdroid.App; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.lang.Thread.UncaughtExceptionHandler; + +public class CrashHandler implements UncaughtExceptionHandler { + private static final String TAG = "CrashHandler"; + private final Class mErrorReportClass; + + public CrashHandler(Class errorReportClass) { + this.mErrorReportClass = errorReportClass; + } + + public void uncaughtException(Thread thread, Throwable ex) { + try { + Log.e("CrashHandler", "Uncaught Exception!!!"); + ex.printStackTrace(); + String t = "很抱歉,程序遇到未知错误,即将停止运行\n错误代码:" + ex.toString(); + Intent intent = new Intent(App.getApp(), this.mErrorReportClass); + intent.putExtra("message", t); + intent.putExtra("error", throwableToString(ex)); + App.getApp().startActivity(intent); + System.exit(0); + } catch (Throwable var6) { + var6.printStackTrace(); + } + + } + + public static String throwableToString(Throwable throwable) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + throwable.printStackTrace(pw); + return sw.toString(); + } +} diff --git a/app/src/main/java/com/stardust/view/ViewBinder.java b/app/src/main/java/com/stardust/view/ViewBinder.java index 8b1d1a48..68886070 100644 --- a/app/src/main/java/com/stardust/view/ViewBinder.java +++ b/app/src/main/java/com/stardust/view/ViewBinder.java @@ -1,6 +1,7 @@ package com.stardust.view; import android.view.View; +import android.widget.CompoundButton; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -21,7 +22,31 @@ public class ViewBinder { } Method[] methods = o.getClass().getDeclaredMethods(); for (Method method : methods) { + method.setAccessible(true); bindClick(o, method, findViewById); + bindCheck(o, method, findViewById); + } + } + + private static void bindCheck(final Object o, final Method method, Method findViewById) { + ViewBinding.Check annotation = method.getAnnotation(ViewBinding.Check.class); + if (annotation == null || annotation.value() == 0) + return; + int id = annotation.value(); + try { + CompoundButton button = (CompoundButton) findViewById.invoke(o, id); + button.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + try { + method.invoke(o, isChecked); + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); + } + } + }); + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); } } @@ -45,7 +70,6 @@ public class ViewBinder { private static void invokeMethod(Object o, Method method) { try { - method.setAccessible(true); method.invoke(o); } catch (IllegalAccessException | InvocationTargetException e) { throw new RuntimeException(e); diff --git a/app/src/main/java/com/stardust/view/ViewBinding.java b/app/src/main/java/com/stardust/view/ViewBinding.java index de739858..a9cc1194 100644 --- a/app/src/main/java/com/stardust/view/ViewBinding.java +++ b/app/src/main/java/com/stardust/view/ViewBinding.java @@ -26,4 +26,10 @@ public @interface ViewBinding { @interface Click { int value(); } + + @Target(ElementType.METHOD) + @Retention(RetentionPolicy.RUNTIME) + @interface Check { + int value(); + } } diff --git a/app/src/main/res/drawable/ic_developer_512.png b/app/src/main/res/drawable/ic_developer_512.png new file mode 100644 index 0000000000000000000000000000000000000000..2562420e5df1e8aa22cdff3a036e10a50e5d4a60 GIT binary patch literal 18558 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_github_mark.png b/app/src/main/res/drawable/ic_github_mark.png new file mode 100644 index 0000000000000000000000000000000000000000..92d3c954b5e3293f61b1b6ad27e2ee14779453ad GIT binary patch literal 7157 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_notifications_green_48dp.png b/app/src/main/res/drawable/ic_notifications_green_48dp.png new file mode 100644 index 0000000000000000000000000000000000000000..d8d530df7db86235447a4a031dc10e704de07b85 GIT binary patch literal 1492 zcmV;_1uOcAP)J^mu z0K&+1aYjr6B&XX;gQ*5T$rA}?5XnrC(JmlUY8#E89)7jxNV@IxM!9PG@34Q-B9{c1cDsyS zc8C7Bqs~C&{$ye_mKX^}Z-4XEXe$8BlE}!GToF)z?DdkHjR!4SjIiOMNc{50fqejQ z8zb*oP#4gAwD3Y%x$1q#9x|W$R7{Mtz0rF)kx_~opmIi7YP373RnJ_jIow@YE zkOean^&D{IRMC5`gO-z+nc1K>$klR%Wbwhhgk2WlgrKlkp*iL$IgF8oB4FY1$~lZ2A(?-?+>VihB0#B7VDO75ygLDRQ0eXY{Ino)Vz^I+L0G&~8Ae})9jM~Z10HX}$cU}_cjWP}C4B`Sx z%9IMy8Kl^>RYUwY3!;~YzHYk~0Om<%AfWSl{0pQyCp`m1d-(YeME8LSNDmW0876=- zOaNt=0Lm}{lwkrW!vs)<380Lq1?UL(j{(trU^5^+qMiXvKpL2U^e_RGVFD<_1W<+v zpbQg08Sx5Oim#TE>>q=bmBdDp{Sy<=-eK!4P)Kv?Nk}fpWD@yDzRF=z{S*1Ci1rR! z?{d~1pug0EL_)R(^dum(G*LZV#~;9}k{f7mhT@8|$-E5dUo5o|0G@iehO^1M()aUBPVZyRzrMcW z1vTe~{P?uRBIgDC`P)C7UmeD$EfzU1VBqe2=lEzW>wif#J`zm~+@0?vP?DhJyZ`{` z4+SE3vTZaHjNSo&eggFfiWmgIw_Rb^SSUJ|>Gorx=-jm{VHe4oghCXTp-)h}*kHWg zeAL=jvO%?G-Gc)QiJ7UT->-FrT>!9zTpuUIBp}I-T~5QrQk!b;^Ob6|L;^587?}-+ uVz>UdHFq9FaM)om7z_r3!C){L`OUvQntUaIG8UTv0000aB^>EX>4U6ba`-PAVE-2F#rH~oK?uN4S+BV0Kwi34{c~y~G#-_?l20f`I@Rh)s2DQ(Um+D#@}e7Zs~*J?H)XaU|L5 ztKB`jYrLQ58L;-8Gc)JR_sp5{&O4AMO`0@m(xgd~CQX_&Y0{)glO|1?G->)nB|8I$ zAoGFIzzDzt6apo{5FiH-zyw-=UBK@4fA0sj0&9WI3D5N*PFkn~QwID1I2I@Z3a|v} zi6X8>EWz#r)&P$IAI2w}X%06^fm?yaSi%yUgCAG|`~( zam72-0@uXxIi*P=&yjpV*&P$y; zO=AnGI9H$S@F}2Ud8ldP%QGZj6sa2i9>a4@6G!eL`C>@*@OacuH%(lakF~@j*+NM5 zU}CLMNRtHeflVY|1cyqf1CEU9NvDa4$4P$SA8O%~sGfA1s5uV^ll+1|6vKT{Jnxj? zP+NuS2HwR+6Sv~xV#bdj&*aIIX>4p{%a$#yU%%d#w8o7ahs))nwY8P%>S|lk=tdh> z+y1>oBz8FSV{EK(?!W(j*}QqPbm#52-dcI=QP zOP0vlXP=#jTJ`-{3n9(G?8K%5eEH>bcoasO-nkE(3h#|K-so4P9fU$5x#gByqE4s0ygZ_G9(w2@yT!U5%fm~W zI8z2}$A&_?E%FX-Z~h=AhGg_0?Agl};=#M15kW5qbCBcL$Zu%{SjHrfCi;4WG{^ZnxV`q3(=h`J`!Q2R0PeJ@?!*XpxGD1OfrM z?z-zDPG|e}?NO!k^wUqA|h2)RdUQR$Ji;E<7U<2NKYu`>JpTCOQdU+bfDA1zmIVtI zbU7YLI?I+V>k)5tb+s&g`DJ%X+=;&4We=F1h5Ae$$vZaiVP7wyjINZ@lqFkMkBUUMz-T^qP-XUwzeXp}rH3 zf;!x}0h4w!&2sTY7YQJa_Ve@e@&u4kBS&_g_taBQ^_#{OS6m@2EiIkr zzyIEQoySIx9xW3lOz8Z3X&>Xbb#--i3$+2u32~YjSb+_N<8(UZqmMr7Q>dFaZR&FV zHCJCPpMLsj=YaqA_FD3jPd@24onQRo7hU3=G;yK;a`MS1OL=*@R8>~W*T4St&hx|J zaF4v0rfIiO1-Lgp#dY{nhYbZYb?Vf92j4qBx6bzSckS9GA|mV8trI|=e(EU^5m~cl zO~2{fdFP#-adun_$f{MVI)C3;UETTnD@&L5D%3f1=GZON*W*-PwvozfYHq=%9%*)V zHW?WieID;_AToUTZ~(Hhv&qTIV$-Hg0C>G#h7B9mXFNqkMVsI9F9;Kx7uQIGS^Irm%uDl02#YisLqJS)p~Cnz~sD|u6v zR26C_Fv+gSo0^(vJxFlf88>cRm%p#M_F5i!_+idGMj;-@ZPNmyR3> zSk~E2V8ezDeD9_M21myocN_qIzn_|#nm*&{NFx*q(b_KP-fBmO!vR==42Q#Aj)@2x zHf$L9ref#IiAW?`Qng0S!Dj28{%XR}qepYywbyq3?c~54o$2*5rM=B)nr6Rg`2Bvs z66aB~X9F;O#*7~4jVvv-j!m0JZf^Ge_kpWChL_%LA{vS3E$^7njzw5Kt zFCy~MhaVmo&N}G2gG~Y#En3uX8dqF#g|xP|iil;;+SJq}(uZ+Mb91u<0)ZaC*Vor4 zVt7ih_6zuKJPPk{!gi+;bLPzHSEwQ)Pd@QPmunV1^Gp{js4K6$vfnf&O_~(7K}rX& zz4lt7get(paVfpSh?OLuV5+OD2NcTw{rlzp_uiA5ojZFRizJQS=K2T2x4-@EL<;rk zxRl;uL@fy@nBV^Pw^0k|l~-PgD2=nuIxFfls;jHz*kg}Pq)^|AOX(d(>?Q#PbHoux z3~0U78-BlEuD<%}h|{U4sEA6a1GRx|2<2F-Dbhs15hQSPh`}yJ5fOR)_16cL#;v#B zI_NY4fk0GCUSbT@z=Rmf@37$_pp^s`(DLQWBNk9=Yim?#q~MyV-a->rMUf@~uEW}K zIbj7{U#C9{iXhTs^(SYmvAAIn^WQnvR93NGw*^DFE8R&&C179Nvd3*NRXW6)MBR-!G z!!T%UY-GiX6)ak`h;Mx38`QVY*GEfRTN_V2@dT!6;&!_!C@8??amfjHew)GWkWOqo)oqVK6619y=Eb_ki7nf*?+0u<*sD9&}@b!$3|u0+5e6!tcS z+1qUNd2LBaNvH3r{%j8t%$I-kTNe%he$PW*;j`!rr1SUp_5U=+=y1> zcr=-AMUGeFcB(Ey4Tgngze!tAXbzYt5vq3wsoWQ)YF~)IE!*F(K}!Ph84>|b%(k(W1;Jj|<3$Wn(rG&!5 z_L=~nRRwsr+(*s65Zh{ltlbf?;qD?L4D_@!OaW3+s3tv2-B#|pw3s6&WH52Kn^E~r z+&K;ii}lKwf*8`7vB>HB78F(k+^J#OC@<5-db#wJJVGr7RSjXb)Q0$UtB*UM-$Pqs zH59`JiCU#M{>)1{a8t`~jq@^X zgqw_P2LuHPOUg9LM64I3BSQ+9T4Pz=PDAtq`s>~W$xVS~XbK{QP(;I_Y%AvresH_e0>u2|};O)kk=5Y}L8)ThhG__<-(+;5i$}jRf-{cFjydWXZsjUa;d8c6 z8};YdGa6q~N~kW>ky#3USezGAJVisCcyk??MptEuz@AElc7aN@Dx)8i0_}#~+ZEES zL2Vj>GuuIaPHYo-4&ag@UO>puYGh22*+9w&b;IOgCkc|>W(xCiGPt)i`n7!@ZfIl8 z#x}IGs~WWf3PuQP-%*4@pi}1V`$lUBh2YaSHF?7X-L3npor(>ceXK0^#gxupMh|6r zhKqm*L6KSIlZN$N*PTRCrl{Q7eWalz10W>A#rfG>TiA0&W+YVZ3vtVWT6_Vsi&#a# zodIKJ3M-aq+L}Ro;*)m=QhW8e0#vCDJ4%>Pvd zudHf8XXwsPy=ej(PQJ>dxgP%c7foX==#1nx2ebyA345y*uRf}2sD;!1!^G*LQ>4~8 zn%6&R;q*JJ_-J$VpZuQ>%jbroTw1&NCkTsR3a7+!FYzWNx)hryl#cXx9Pf(KV~lPC zoEmT{#gp~T{IaGl>NKu9IgejmK9tgYCuXQUjrLB;-tCIzf7KL>5oVqu6buuT1Iz@? zdTSR*2=>-0K6_2kSgrWdl_n)q1PL7Y+-sL&S7Vr8FW$?a-)M+BJtvAklofGNUN+6W zIMHw_5L4ES{=8~d)QQBIlo0BU$>WYNoyMBJCixZMQi_-Nw{qi-y-}w#bCieME-dE4 zlky;FVur2Mv=c%>ShrlW=2=DASA~glgt8;r$AUs2Ch?ghXdkmz8f%i+fNh^Dwysv} zSgJVUdSTW)6L-de7ezZ1cr{CwHS*i%_pv(0S*aJt4QFnq7k?i&qyUd*Ps!TKzFie2 zn3ND|?etM!cRCy|HyQm;W@aeGhCqlrcGdG;G7Yh2ew>y# zR{m2{xkAxa4U^6h#vdhQ4iU1l+B;vufmtr;Tfo-bJ=SNTef~b|ht^g_OFeA)w_?kS zikzuXcC;|(3=?ODRlAC`H$${y)iysjKemexH^tVopP!q_Jtc({I~@f2dFvG5RJ8iS z##NIxR=*fiqH!W6gt~od*`K^l=l6UA_;Ld9D#hNg!Toz0d8)oSrgVRONijE_Q9#}h zClWLfX&09Z+V(@m8pWz-G~qhPn+Zck3Yqy(R4U{aLe3DulL?M2dRk3{AlwYTHbwJ( z*uNL*b}4)f&{(Bt+5oO1IO-CUu``9N`~w123Y1&Z+#KfN*BbcwqCGL)C%_%U^SQDx z2ai&OBlt3CFiq3EW88)vzl}NZIFJ%Tt(Z1yr9?-yA`Ya4P-|w4sR@dV7_1eOM=9#U27jq*;-S6!W6HxBM`m;Pl|z{|DHD7K zW=DUkU9h!V6>r?5aSj1Tlw+?(074CL+Rsf!jF+wg)j)=3_2)irTeO>hej2+^)VoRw zIWI4ZT&?^4)c1xRSj$X*PBC(b?R6)i9=y_CQcNn*-VdVIQo1Q?qY7G*>HvO&pj$ zF~OAsxn)A(XgKCH6K5uv?PjCeX&INiwV{>oKC&yO>CZB^lWz>k;-dU)rg`18m?lQ- zj}m|!hsH3>>xZweTo9iaqbKP?t(!6Se}c#jzBpSlyOkm=LRB!#3;SF7!=C6qskvUw zU6&8#hWYup-P#&|J!o_w*aG_-6u|%l+gly(9B_MJNWS3CwtDl>ZbO=(`Mli6V{bL^ z;L_Oq1l(6z$O+kAM!Q^?STjoTB;Vnn!Wa1E?9DsxifhDCkaVE}@4Yjz^h*;xE`m0g z-CKPWjUmFD&27BZ?Bo4bKU)KXpLSY!Qwb-{$YRV;m-Xbr?Mp{G7Mylpo!YVfNke0k z!N-*W{`8MJmaL4f9eq@$hhsB6oH-QGBZdsU!%M}SSWL0cHV+ulYO=VxDVVUVhvV?j*@O*Cvj?8rPr;){s_qgzxi7TWII;Z9pIF-f$xRm9O zVn--UUD%+-G}#?8*c~=#HBG|O`L#zl(D@fEF%EGkikuEcxLjl?MTy(NFsH+6<_d(7 z4%52MI1-IVDc1UeoW8YRH$x9$ZT*>Wk|orSv9^%xl}TO~e<&?tcBU8KAg2B7#-TvB zKe7%n_cDCiVSm!)H&YI{fJwwBJW@1}?a=(av6Y|I)UhwzuScZ@U<{VS--MEk0ssF3 zF6r-ty0FPJ4K3t59n8pZ<5a2PxvRry%Ea>a6Bg_9d~oRNH{+mdQ{~0;C`Gd=+*w=C zuWB1;8~6*Bf#o{=Is0?hm1GF@zlm^HzPFowRE5IK&GM4x&~Y2cKHO12rq*l@g!n~G zJufs4YDTOKs}r11AF7EK>W_d+2Xnzje~3r-H8IBRVuII&N2%nw`}+dmQHoX(o~Uo; z>dHNA3l4fb*#i^-i{qcWzDaZ&brUh{w|PNc7T+(h$Vv0{UM&HZ^q}zWbU*Xu;ydP@S+?kw1hO( z@U>#r?_!I?%dI=>xqEj5JAyHLmQ=u0U{UNDjEqFCxjZXg5xrMBnu7m%l3`2UKxY?W zZmmSxn&Y&n=?j3ENb7!#^_6&M&7tO3f8w;7{k+xOznk|#ay-_gO+rYNP)`Gni&tb* z$BZF=#0auZ`5I$BUdOPdZ{R)cn@Cf~hJS}CVq)&9M4Fq)IR6?-KVHR%7hh%4#g{O< zee3o(QUH8E-jVi2qQ04NohLr^)Kk0soqfvJ$ewpH`(Hejec!qSJ#O^jp;x8A2qV50 zWPc+xLe5>kChy|QaE~6->7-y-VIjpuMRw%iB&_D6?fu(C)TonzW8)d&vB&ljopxaQ z{q1*@Y+D<<5yan$v91DujBj2|@zXCe-Y^*Yv)gcw9oNH?#`Nja?a0V@;A}f0?oJ|V z)T@Bvct$vKWbe-Af}ehj%FFy>wNaT3+3`g#;L@Btocj;~Cl5v14&Md(U=Y^-5G`O8NGR63bbDG}R&1ZIA`-`Dfvt zF`JAz$B=!>*U%Z6gNkwD#HdFF2Vy!f32W%lHtZH^F;+V!Zk%w!3Ao+8jGu~NHu=C2 zduv9T_JP9%PB+Tw0*A9}jTLo`-OV^a#A;)P0uT;Cs1*r^!Edbw$h`8~WXwAi?-57h zEXc=^Ul8>@jUGKZ>T3s}2)G#dwOt8-{X#vHIJbj`4I9>LjT+v)3kfvGmYfLqTgbij zzX;dtBD`Ze;VqwItS(2emY$FWDno&L2)H~bhr??Oz-Vs9Y-z!4Ys1*zM5tmbMtwb@9hDf>RTw*~FzfbU zHq;?)f|#nk(iCum@;Y%86r+cgpo@p&nlu@mUx>S;1m~!+=*$dsRwj;|A?U13qFjg@ z5n5~V^73eGjD0zFFU$q90ecL0v0tch9}q4s?!8|Y-nA16w8Y*hcZYDN)5*-4Gg-cTxgF7$V444|vmnvPN5zNMCUHLA5LLF~M zq-JkER80f3x!D@;Ow%hOg5Ph;{;3^g(a$=#Sg}i}8Ccdeai_Q86){Z2*J5oXm8Mq= z!=R?7-xa2@;wHi+M$urGP`%hB)cyN=@q;QR5)9fp4tc0!nkHMfZnZNBH`XkbE!b7E z9;{k5?(EyQ55wqcRVE@xC>Zp;UW*t<9SjXEMgVN>M<_6gOt{&!+c&$j76DkZLdS_Te*7mYJ$OT?q)>VcMMA_wJ&z=jD0_VWOB#}^|Q}DBOLC& zI87iNPV2NEDk>_HorRdNOQ^OwHfd_==21pzl*a=}@KtrFP+nf1h-6~ho~9q{5^4Y& zEos)SUEAev<prT|#XEqUmBb0J{b{>BA2{?DDsA zx$(|E2I*eYrU4)v4iCn>Zzr%Kiev(SZJScqCDbs{yeZ`z{FZ;&<#_nR<)poS+4WppuCeJ3CW@wN0!5{se3u=){_u8ft61d6RLv zC|$gSA-}vAso8SCr=ubj`eZ^Tg-#4X)I}Au(E8C0t)8q209- ztf>)ydAa!4u93jDZDO>v*rS#tvSY`NNQLGHF6&kf#}RpD6W3+&iRNDne1i*nxvmu0 zI?%P-wtcZ`KRfvS?|&buP(SaZ4DXHL+6Ex6kL%-t-7{1FJ;3p8z%{-6z7u$JpvV_5 zPN*;0Lkdta2JvkE4)kYLEx--*?DT@w59zBmKBPDmXr=4hdvb)=j=`#V`>YMF zy6P$khr`LPyi$&ahK5LM)4`ZkO~l%0;^6CV9mMr1&jrBiSYva8^;PpA13c{Y>(?h+ z7b(Ys4?Y;FP;VM!d1&Cfz*68p2YKxmo=x=gu&=r1nq=!DrP#A)kIb4iD-x0ZJMl&N z#pY}Vci9)JAtNJRS2B$QE_ zc3!8Cf|)X9iqzKDCR;PbCzka=xmX`J_(jT5(Xv#mP|3jXg z^wXpiP#ihry2kRt)Kd+EE47m|5egJaBe3x8My`FNcLShv&N+t#3l`Yz!#-hr@WBUM zcinYt+_io}BemXU!g=+q7${%s)Yn39izXyLX+No&u znLO}nJ-09F-Eqfbk3GgU*Id)<#%ifZV`C%t-FF{%-E~)==ltxvLVkQ+5e3-}%m{af z(OQ91Az^cwzHq}yamubOq@+;gZ=;9f$b1&9zDh_2?fXnCz@_>bZQC|(x#gCAMS9=2hVjzR$~bXmHWD7ZNWmH&FvEhxZ|JdvCybR6tU(4s#vkE9Fc7YL{Kzl)R8(J&S5DW>6-rdiOE1G$ERdbK?#*ZJ*Z+`O|jymcnh7TW3Zf^W`%M=kB8yl&v zu4ei2<=k{r-^-RxoR-PyM`!b$Q}W5nae!cpKo3THHH5>btMkiKW{Gdg2-SFY;-$*r zT!2YNBKAel3UF(Jev^+Y{H)sK<0pUJjW66Y@e3}vfLXI2H(X3UtuxN+mi%Nv|y zkUe|$uyyNJ)~;PkRaF(MR;}uHIr9&`UcmXs=Q6p}Lt%jv0%qJk@dKef8VQE~qAx1H zAu%ZqOv(t=Ts-+#%As!;6O{m+cA^w0-9D}eRO||}WOXyEw)ok)E6BgM^tA8vcsyie zWRRDa$FynFm^yVTd3kwcXJ=!YCM_*3)Ya9oZrwUIZQ4XjOA9S6ExqhLU@@c2!^9D8 zrj7P+=B#W^n3{Rupb=e%G8VK`A%^*ZzG&l@5}R`0q?}MqGkJMZfO05sDF_QY_Jydd z53{E(#Ag+L-rv~9TkG0lPUna+5A$YZanv|3BZs*dUFc#|feUw*hL9lP$i|HALOT_h z@`1W=L&^v>Wi}60m>WcEzmmj!`g=pLX1*{41(X#yDJyirqzt}!d~W+}jw0wc*|9go z?xrxlpvk^wgXVy+b*F#xJulV2|BX4>CG%!xe=R@Lp$fAdWP24uG98Q^>LMq{VZDh5 z-=k@@TTNerzU>3yR7lY1&x=jMNtqfIzBisx1}`s{KD5%>@+TP~cHeA3R!J zw&`Peaw6oqKE|zQ6KKB~!7>mz=+9I{0m`E=g63(?i#87Es4h{Y)PTQI<}Y#S)Ovfm zA<(}6nqY@M> z)r5L}`4bWdzp6Z`E!GaSQ-K4-G_P}9vS~s0<6)niD5kklXB;B;<5GxW?g`chZ%cMw zx|5R6&-~kzmy}bVLpbq0-bm0Is~xA+N~1OKW7lO{mi2eOxn$a6WpWhbXLGa0--f$Jncc%`jp&F*fA9zH%eJOeC#r*#6)Hg6AInNIMrJ>Q$y~JdO2|x# zV71el&BA1t7_wYnwBeFy<1!Xc`48<OBECC^rM4yB!yAelqd7h@6xb zY6r%%Q@*9$>U@+s8?7N|T0Llqf32k2JM-xF@l=;W+QOfKdMoTVpKxDMzILEEBEfie z^7pmNaRw%5;Ay`nLpnQa@kV!yP&hTX72*qTR4)DG=TCqBr|Hkxw;gD_I3$F6Frh`0 z?r?gX=b;#eAwzL#hh^7?wKOFf+tv2@f3$*-5yGkWNZ7154dWGu%loi8e{HoL_tJr} zc5Hdf^hqAt%%h zLQhYatKF{Sv`3W@lA}c!qZDJva#-8Pn$r7N(80nq1!)bpDeb60o11Yu)|mcKtr<}N zc3oAzD$)1UeE*0dPifvMF1MP3mJ$gw2VsPAtKqnH=U8ly`|7AIRr`H~1@W2taF|uf zp+7c-?GgxYa9+B3Nuuv5UL3MQ?GJfk!Z^q%M3)BS^cveI00000NkvXXu0mjf=krYP literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_qq_black.png b/app/src/main/res/drawable/ic_qq_black.png new file mode 100644 index 0000000000000000000000000000000000000000..00523a9cc272851fb0636b681debe783ff5296e7 GIT binary patch literal 16464 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ic_robot_head_green.png b/app/src/main/res/drawable/ic_robot_head_green.png new file mode 100644 index 0000000000000000000000000000000000000000..56c82ee4408029812308ccf4c78b3ca2d7f55798 GIT binary patch literal 32853 zcmcG#i$Bx-8$UiN>XxYPQsh()6*&|MGb&;s=|IGYqJK&L1%tsv zk!HphU@$>B7;MArW+CuDHWRn@fFB#(PgYBO=2eS!af{~?~+7$g9T^84E@ z-AvD}+knD{V-j)oHF-M~hAq1_3FioJuXaBq#7pya;&8ZY!}t@ZZhuzf+%}|>({lI$ zWK|r0d4@2XwBUw}rqtt7@=D_PgSLvpdTWc%wfW%_qnyImj&oOGMj;+Xu=k}o79mJd zN#3fto@Fhih>!@ z{yA!3VwpJaj1+sk&^d2dkE9+JdJvGCXLXizt{eA=&qX5X6Lvx6tnV;6AuTyr=i?j; ztCR&Qp(7zF9``hxA+xoASrHknaG8KmV&)PMPuzRm9VLWd^4S6cQG0i}g^3~E<8V)3 z_1+k}POr$8sCw;r_Aruu)}9b3ni3#jqz?uyjRS)wFZg<;#~F;_5XM6(+iM=Dw^cn+ zklx4VjIs+!T|w7i&eEcrVUNIwI>^z(%y~kcW4CM1(B^H^J?@IUg1lw0zZ10ACDm$w z!BoNI;?L*xkIB4vF%Vjq{$R|S5L{g>dQvxsfg&s;SKj}kQ!rIqqEdkoVoq7Vi1nJK zhq8as6MM+|f_uJD32Xk;5^qkSeX!%-u&wunHX0=~ss9Xrn|{W%`)1}iNzHj@6>`NL zIrn(MihyVo*(GrA5qL=BpQF4R$WiUJpvt_On&K@U-wFsLN0@Vpya?iD*#JjzSl~mU zjZsxiRxkBT3oM0o9vv{Io0IIjYZM%xy7yWZi)@I(bVk8`HvK}xQ_NQoNGn^8nM0Fi zW1bDCc{JqgiWG8gY;8NN?pvei`?on3bFW?u{5pxWN(@w|YYRLW%3)k6s!v*|!q`N# z1f7K4)B@IRKh(N#n?THd!3-sYYN?g(H0>E`T(c#t!D+9ps?|2bj-M9X@cv$og{&IW zjzBD8P{&{l&NU?NFjE?gGZdr=(>Mv9NXxOHUHW_zZr**skuJD#I+rja&$QwclKQ|C z-_Hnca6WI6MwDk#6nLe1(eH|dV>*KfBTCF8V2~c@5irfO5R){7Q8)gzC%hxjQ7mc~ z{cKolo?&bG)Uo1N0dZkTaaira)&;4a!dt&z<|+R(FH~CiWC4Z5DKLG(FkN6zA3oiK z8M*&+bodA}T+zU(d)e&E3`q%gOkb5br%;RR9v!y}>W7{?1yl-mldV-Ku@@|tCyu!0|#h-rvcbS!2>KE4V*e(wZ64lX?S*|>Xv zfI7%bBg6+e?u=>}KE$Lc)N0aRht#MEMd3iy?z?RLBHwJqUptQS(Sa`b{t+HYy3{Sp zunWpyxxjwi7TWm!$v;OU3iDE4VbXj3i&+BBeKTG%ldDbe0>lr}9#|!C!_*5&%rdXp znb5R%Rf6xQ5eJz&w3q)GVuFvCfJ-DO0MD02s>|?6Rje>r=$wd`8jYkydrgB@A+056 zG!ATXfEkrH`7onZAaL#+5~s?{ffuY%f$fKK1qAkAN@Cv0lfCdc6q^r5Fdj1?s1X(< zFg9_}W<@2%<@S%Q>K{dx5EjnU7hy4dK?GDTgK0OUyutW^(8d@e>lezetEiJy}{$MJ&VdKk# zpM}q^=xVErjq{{oSpWRIHbveI;$=P^EN}&Q*v35Y1af7Q_A+KV7!2?>@XCclOdP{* z@eutJ?8k1=&Eiox7WGKWu`(+y8Q2H^E8V-iBp+Lm)P#(5z%k%=xve-C9ha#AX8<$M z-OoIWtOrMp1E0Ugg3rak=P+cws-zgqUpME5$#@E*ub7e6J)(2GXzXS0@FYMtpTjC2|0;exs1%ODHevo=XH_w3QRV< z;0!d1uB7<;R1jxRE}4B9BkhL$>^X@v1ju0cPHp4+GhmACCTTASk*3|t?}|6UHq4(x zmb90@zU8<%>N5Dy6~y0urmaHldH4kh7%AAedkz^EM7*p64hRNzU}61&Vis1N=adxq z2JArYX4To1AfyDq_Y{`PIu>sG+ihi-fKp~|FZLFQYQ{QrtFQ~h@>!>%t^gMm1eeQg zFFy_33zj`h?iTI^V=Vz7$i^689*wB^Rd}RLH_c3M1VkDP*-clhJ=2Y5uZcUK0Nx31 z8lF5-!aOVrybH@%d6XxJvEfyNk@o=aHULp5K!~*M7K8RxdH|=$%x6P~b1EtUOf0R^ z8kmyD^O7kF4*{+TyTQJUEO`>>PrMAp@x2(KjX%y?zrb5_$lP)V`UY5P8zD~u_{~ZB zeONZQ3-rz>F&`2lExX$kjsReSbv}HYr(?GA30~kA;J8)%FG+Fdb0%qP&(e4HFu}%Q z3*XBLs7&`>ez4j9Ufn(5qj21{G=n?n*gIZ20vc!|k@TWJ%b*9aLeM z(aJSsbkn2|?3nYWjVJyAFFn7}J7x;)MuX`~Kz*o{f8PNtH3%m2B#fvMZ*GG1kGLxu z7=pRL8I;BgZR|G&A!@ebi&Wo*vx33&FBaHo^3%X3Lmam{@7k&2{B(Y>y(D4bCcOd% zBQN+P?LhQRk;LEc2L=E@2fS5|nW8WQMeloWQw3gno>N=7*FcbFlp=7iJa9$GfuORw zNTv(ge4Y>@asXvD*^$qQt7!8Wj)oA=F2#h>O_I2~j^Wnl7nt?vE+qqWm5vM(urIG5k!u% zgTw~t0`JHS=oonT!tm~5uWfzJtX|2%&y#1v67zPtQw!;r5(9r$-G{TA58&bK%^PwQ}_C!Iu~9pC85B3k|%P5TA;J{!KAMI zV^bN-_+!(NZRB&^G;j}vvZYREs!z5Ee);N4+tc&wYKlqGD#PSLK?AygJU0^lIYOb< zv3m?Gf#q+q6Dh2G;NK-Q>yvEF!m!paXxt3;TbgGS$88YqEK?ZetTEPrPC33U()5ce z&o6n|VAT)nK==XprG^@gGlTQ#qG}?S^G<5m}0Xe*Kcn1zuw@7biHlplcPwbI1z@4 z;2qRca9$#W_|HuZbMXZwk;^Y*$)<*jec@SQD~@i2A6v>9y^G@+1)d_YK?SU+7U<-f z50pfcm(Paz0mz%yDv9Qxb8hT!w!vwv?wXY^tv+M;{kHb| zVmtM8WD1o=$rg1HuM{JK;u&MJWBXNA zzGT7IU9JGT@){bIyW0hbnkB8px$eh;G)aU_7X5 zDQ{99B?oq6hvrU(>`Or~3Q9&Jrhin+{NK?=$W>-xk;Ka(X0=+fB3|iYuRP&i+En2= z(S{)pqt3J-{7Ob4)~tKRQA^exKC6;HGIu)!Rl!Q_auw9YB>ZuAIA$(!;Zgk|s~Wpu z9a)O!SS#i6K-KR4m~f-chrXy=JxI=ce}G>^BTpuf(yJx=$4FJ*2U+%WxS`K}5syf| zi1<+je6m;|pc;;84!5+ez3ZepY}4_|k^Cd>S=iQZAv0ebak;k}h<|)rb;96BW4LrA zeP=!YNx5=;5jP#bvr+1E*D;w_52_*eNmTY#u$O*2JDtP*)!~kv$52Ln7Z{(07q>hR z3jgDU#}ZS_D6@zck$pJK59us!JwNips{RT7x!3!Uq*#WaqwA)P0ehXoDr}14)A9N6 z)mUyB1+Qi|bXnHbw^aGx(15#QDEn~B6Xx|gHS_N7)Io;OQXkqvxbpLNSFu7#G5d!$ z83Q(LZ@q=(=xBTcR3fHr`7YPW)(~RC|82QEX?ZJ>pMUT(x_{cxFJRzuLB8#V@~=Bo+b00Vo%@24 zB?bS~=WKDRo2#9}(X*6A7C#!uO#cZnn*9hx!Qcq(HA}g^YtdZfwp~}$`-c^GM{~2n z2Jg;cz#%)q1b=1pYH_)Fv&tJwsm_=AivQRvuyf)F&9{Z#v$e z_^%@opOe*9Ws!Bub8A0(SjHRy$~)nWckKtUSjuuFa~^uZ=`;3^*P-Sx%f+TE(R05> z)FW2EjP9li@B3h$XsCSrd{~Els!RmtWFlNRb z;r|==4?{5i=9b+;WtH4ewphe`8b#VLEO&>rtKUtfKe+dkGi!gP2hU%?M33l&@7FL? zYdAI6cU*Rq`$&DQ*`II1KpE`2W&@b_9Tki~f zc^3Cm0A4pZ@bQi#VH#jjs0GaGvYIb0&D^Dt}TW!%lTWdE@;xmS!g zN7`eBHrDRdkySRchp(nN!TG7KruTO!5=A@4A4|B6tks&^JM>`TmPk0 zWr;3TTxejeYQpo-sS#alJ8CGKim1LzN9dm)7Z8RV_-HT)34ar__!N%25u`tR-U z-_AP+W#)~)qOE;z3z?DO*~9K0!;EiA4r!=6UCuAnEpoKBlaXEu<3BbxES3Acc*XX)oRB-anS-F2d@kE5 zf$~42K4=bXUD3K)4KIlF#wvc)92=E-g_LoOSgc8LFWHuQM(|EYA@{}gZ}n?GslvfC zuW_ddyLUeodjYH!MC@&Ht(}p4oDeUJ8OJ0nf5wG>@=WmvnsCi~!98&_T(WdKK+iIU zWY?#F$Z5w*UO$4Q-#X=>n3lK90wo&DMS#K4La(Qh+*Ot&c;a&RM&t^5m#WL0J} z;1(HeC7oMxLhNGLv<9 zK>eDn)!{Xty5J=5scGktGS>UmLIxwmR-&2?rfgdA%C~B_Z=;NXGwNVBi8hnkUZyC{ zP|K(A?))w9&m75*H5y}vqgO`m-(R_<2wep_mr#Y&XsuP=5rm8ryE!1O3dxbzMxRuV zJ<1~v;QlJzt|I4AbntUI%N}=xdGEMj*7zher5eY@57GCf0@Q~?+Hx$aS<-Yee+k0FDRTXMOnP2s1T573Y!z62uR_Z8**>(5RK-bn-8 z^(GP!+Mde2O+pueRi5g2!WGi-i^siBVfE|AA5UHzu_V+T0H}AP1oljz;n6=wYwPot zktE#U*4(>?Fym?MuDxSF&MdxBBe5-zYtmpVoD*}$2*d>U-o z0|Acw9lQ&>k9z9OLFAYEkd}JLVnhZqEGn;FmL?jN25?^*Bt;vMd^x7S@3BJ2ecg}X zd+`GnwWa5e;;=0TXmoNALXP65h*^$%m*XH=w5Q#@`rvm2|ePYVdtZAuhr5Spx z{UVqWOE4LsnR!)@CjWXL-x=ksj8bO`53XHfL94fG%jJ5YpKsBfdo}>Aq>kY`CfwV; zD@r#xJzVe$V6 zZM=H8HLxVl3B5YWvX?wEC~W~2>_Rl=bZr_*JtuwFMcC*xeE5g*{7o5r`W?`JrZ2~^82326&A=&CV z!{n}V1@#J|8~b+3p8CwqLqib{kHsW1T>H?oWwkRSPt>@p7t@)(L^xgi)lLc z#I?H*?Qz!Z6G)r}(G{lRVWcr{POvwu&MAH#HoPkW3L#2sw00j}9W!3tadi}HcH!u# zkAF!XA7Q)U&PS$LB4q}ZtxF7jjubp9voUd#{`!H_To+yUwB>$0tTsBvn*_N}81?hi za~otgHm(1*eRmzapm=Kk)-~5n3b#NY*>umn`gkKL833Q_#K+ga$#)C*E527!JD~BiFOvmTelF>6u#r6674f)S5sb@sI`u_cc-x2(_ zaPGg36Xu6dVCwg@pG5VutZsW2Mi~PoN8)T)E=vz9o!N4rqyX-{bK&W6nR34p+Tg&A z@RkGWmEt#3Nr+?gB7{c{jOtEXj;42|Ngrf{$)o6P5)y7J zjVE#Y+kcMt#HayUheOH|0?{c!S7br>pkv@F1sn9MX}Pg8$$9Jd^!2VqCG+%|qsK&` z5GhZk-&QvZ3nX5q>vNemAM8pndxX~GyLLg>*8n-&G4#{kyV_txV7IUeNf#dH6ojLC zx6nu&oR}-OUrTQO*AZ=VgX2(5#NXqx*sc7ePt;y5GD0lij9dH)4E0o94caiAU2f*dzKI4!v2-MY{$ z=FsQ-XAZRm%t!7yc3$tY{}tCiOA1?hF`v0<`!j(pS0G6v3{+bjd;j;sJ3qt|yaF|& z*{x(t*%~+>u+qf#3U#^J{)dFM>+q11UpGtsu+L6XCUv>D8_JH)ku#B|5izSRRucIU_~8Caxiw00ZLegFJe5;kCD9zocVYsUR}i;3{(sd%VJ{ z+G>8iF3G6i<1G0cZ(t|;Abyr{;+Cv_AuH2#O7m)wT->B(dn)=k=S4e z>;j1HNsBz4&8H!TRm|xt!7AKZ3R(U%RxP>#99#?}|3uHNzVx%rlWN6<#$!aI;?8QT4?ha|-f9rrUMi(@_7{ye-=`mQv5 zMQ5w;-1y1eQeImBxw&qjp>}|L=s!Y@#{iUDb&J&$=N?&)*y?tvd)YG+qVpg+&_n@4 zIB{pgX|NJNJhUL7GQHXdUBv-ukW=Wlw9)i`gq3V1K?^@clrNE`#eLli?D1P2ng32L zNA$ljKLAe$SAt)%de$7|-lOp|H=S{f1HMjC-QMv6ba&T9bl9Ynryo_!w9 zAGz%B*jPCAKL+AP6p@(LANL8TPugAOmHr1F79VGG zZxnB|>Wtb097)Vfj~*mlo~|WZ(e($Z-zF+uPv9x*FGpVC1G)o(8~NJw%g<%{vj9qf zQfQP=BdFY3CFRqqWsa0cO>7li2ONCL?126MX6gRb)~G#aaD44~o8nmY&PTZdWixbz zr?aFOyY*=5!|e8{`0MC(&bP2d*GuZ&{1HVC1nYnjf5ZBXG6`$>to=6wwdBqKy1ECc z9^^cb!vS`VvPQ27mB+$tL z5?7iEx&X<%MxoZaJBMX|!y5npkdX0RDKlvX&y>NQW0GO!REk$N4+?K?W>w_GfycJX zHAl{p0^uoltoQB9STcWe%zWTB2yX2hAY^04ebd~VH?3}i7Bdky{>d#oEc{FID~9V4 z);f*TK$o`_@8H)Jk3hvLI!SF~250WTF6dg2W7;~YhRjMT# zgvM3Cb^?6ot}D9vzA$ktSuop=Cu^|#eq-<%Vz1K7Yf;@|U@=l<8(hr5ZIv+Id#o_O z{?My+Bz{1)u7!t((soM(v+hJhFWhl=91aUtR*~7Afluxg6N4^rohw8#8le>V?BHj2 zlG+BTuBbiMNz5&TzkuUDd0T&`r>!9k&em(L`O$jJoi89*O&OjYj0}%c0Ss)Nsyt{m zCoH8{OD&S-_lZ2{jOw2cAjpi9Vk+(H9eY1QFF$B4@1QVFzX^cYzYEHl8m(YpL|uP) z4=8cmRj6$ZlJ-^D0v!W2(Vcl?L9LShre(qwu^xghL}8RR(Ys-@q`1^yNJ_Pui`ja7 zv-Ib{rfed)O%$o==e^+@j2Wo~6X8F@~ z#rIV$zwBAc4ER?Z#e-{D!hkC2J{BxbLg!9Sf6%I3i$qr z?d8agxGkCMB=1HU0Ps8wTm9qZaJ``^nHX_fqvHW@O%Gn>!+`*lVeyJLwk&G*WT6OS zLtTp7pttk)#{QS1HXB##il2AA8HV5o8smai9Odsi-Qn)MF3H|DsSz(Uj{}lm-=l(W zUNR5~bGIDL3g2z?b_P`}Tjb~*DZb7!9slJAbc^U~V{A>6s1$oG*{k+uyYokwZ*HX# z8)$$?S6JhAt&dpGcE4gl#XB@<#mEMS#ef(CL_S%hpzY#FdYrJ>+ zJrHNwSZ9<^Ly3oUTnSovPEg9y@}uQ2BcGC zioEE&&yMu&{H|Nwk0QK<-rqM_PhET&!1`YDcA30rAwNvu6$wX-O+j0qhHv?*aiuGB zP8j3QC@RK!klEX(CAMc>=3E&msZmoqr zV@R3(pLXWUueX7ggdSN*#v3;rm%VUIXY~-W#NW}(;sfu*Ucj7?1jHdGs@R)p?r0t~ zyfrFumpB-%kkJ)7-QFd0tR~GPYj@v=8>{pWqhjpu9T{GTCKWl6*l)wP>pG4Q>Oj&t z=peB}WL98rlgh48PFe8JjIB27`DR9FLwWHF?hk8cJac*&pr~bS|4shL^Ji;yk0;$x zwJluuhGoLSVY*4G zWq{yhC*bMH9xwd<#(;_rU0IHU(>R1)b9IRjlP;_U){=U-Ij&gbp@51UZxwTY1p7$w zHGsWiDUg7tC2KIa5bAtG#fqxOf5zsBg>jeT$VTkHsjU?Ikc-FMKf*kW!a#3<&e^as zmY&dKGh~}pVhYI97@W||Sq%>asbXoq7Qu@+pq@!q@Wky6f}!BVnrwG1IbK*ro~xsT z=Dj|&?c&XwN;K5Smu1z?(5=yoTtlERxUcP7U0F_nU&UpXz)G60k% zLm|RJOD^LLz!P_UbwmEwR@_*|Qe;Jh)h5wv^?foDqibsf2^-Y=c(brjki`Z%n!QYw zTOOPIR5zRip}`=KBfFX3}Dg1u(xFc<0H}NrmA#!x&51f@GUq@vU+yUxE_ZHs4wg$;( ze;cD`=UAvGFYKoWU2%cdaAPEo`)s~{WM#`F0CvKMdgZ7W*TeOFjSGRo=L6EN=Sy>I z?4G#^yH7*K0I%;s?h~QN%g-Bgq`R0nn&(a!FM3eXl9CoJlRAE~=e=M6+^zbGB#6y0u(ReHxA|a8hXM4Yk;(3}{JKfTNk& z_umJDfMS=Zz;i+>*A##HXW{_Ww4k_m>zxN6UGkZjw_JK_U0WDi3=g32aV!emZRB=9 zN$;sQCsxI_Y@HL8M-v&YZ!^u-^`^a(?ejKBG0^E`L%)CT&aMPMvYD2w%Kw0|5>im7 z<0$MO8dmC4^5}>I60F(-fUD+#DZ+kh2me^!{Fv^DGWe%_u)ndzixE~o0o>(hOZr8i zlAK*h%3CEBf4cMk#mZndFhtfB6ON`2s$J#4MRj$pTkz)cv?>xid%o3l!K#CFl3FVV zdKDBliWG}%Hd0C#L#EdaU>`B=lBtbDSWp8f`AzUZ42{RVh(Bqegqs8aaM*C}+2gU3 z#0v7F?NNn)>bME%)hGrj=KN3p^wZWaL4Wxu7A9oc5^``}5`J zQqC!~acGMoMg=n_lsDtn^Y~XEXk_S+-KnnD;5E0aSVY5(s-slS1}Yd@smyYyP*#ln zWx_H(;APfi5z4`1F*JehBtxadlTUTyYt%ltW64lgNu3u89{Px7?~qX#1=8TEwDZc| zJJ6}|n(9wdZk$65_ThywmF)ciDS5)6+3YUs6!z0!X8P*8sL^@ckr*!!i|9J?`3!uK z+U2rHcyoqf$vZ5q^>ewB*q+U0+pC>Nvzg2HE%xZkj1RQLc4~St?$nQy#GU3fGpvDA zAy;sObN-I8G$=`sAj`#3@w*;$) zI7Y3{Q$d3?7r;~8)ju4Ru{?{)Ab0xNWI4DrnTxc1e1Y2kP$+K`;?^->oh|}sp4;YR z2edKoEQ!|Z=3ltRZR~kD+BwuCoQ^^bn9+}|F`)?>2b+Vo*LiaL9(dID2MN?c2u??+ zH*I+`0o=HVd|XA?W@cfI1pYPh8`J+)u~_8icG+5KkdR+Tg8s}5mOU0y#7ZJi2dToN z(*(LLDh5A0aeM1L#L3u-*?&=1*`3(QraPdRnSDTx$l1da}1>YEbVo} z=lZ0WM(6uYE%n;qmLpEcj8o~@o(h{0{{3CbFVhaVfCgLr<^A+czh3;|e&i)gww7#p zDHa56maRi&J_aB2;hm~CZ_n4kdASltrOJixITm&o(*^Xsg#n3slLz|3J}M_Na*HeU zU=VzIXHAB48a`v2%abHNjOGLV$p+OO`gUgcVM085Gbj_{Z36PRs8jn&%Q=NE#qUlR zMon+k$)b4x9V-x`eZWrlTDl8Wfy4f$)qw42y-soGpFCsHbPuHX`d>zJ{UhMbgC1`) zU!ph>+EmJuRF#e>e3vy)FRhSSiGi8Gcx7+c*}aNaRR95;;b4J!XBv%pCBo|+u>Pr zqG|ANDu#2;8k7S|kj@2^Tu?s5lhi&)Xvvv|)Uh^T%WlQ}ko;HT`tF5Lvf2kUUs^s{ zq~yfML1niiYSWClt8y5YdhWSK*YJ=S-LY-p=FL6$*%Y~Q9JukbV(p-~m&Tm!r-(F= zZz-J~$D}E@3@Tmk)BG4cw*BhJgYXlIitW2YrUn7|-%U696@~9v`f)wPc?xOk<)@m% z{b@*}FkENCcLPu0Xw#OLAN*_ztY6PvQ?~?Aq@7Rtih$0+Tn2SAA7D5MDR`k^@8-d6 zHg#J&G{?DLK;ZzAv$0V5)b>B3gW-k{bY6s~S20ldPoO*F$dCea4OD_ANaAf*1O~n= zKV*!(e6gOtZfNHC=bYx8M7_i$Cc|aX=O^QsGLsLJ@w%C>Z)|($+Zp8(r})-RVWwpJ z;;oz8v}jdewTg#9W#K+C+Y z_4)ieAN(sw0#xIGIS6m{8mi*MD?hY;tn^yHls|)Y#q3Imi@c;ITU&-mZ35LZc~HXB z1A&WIz@Z#YcqSG8yQ-v@X%}5~YRO5JUGLk;y6fqK(UJvHf*iZA?p>#_uZ=fWPeyb6 z8YT6j-)*7mptb!X5`W9lGzNe|*+dsM2F||Ino)S~*Da@JRo4VO<-j<+ecak4?P$r+ zM$u+1yBpeIRtbx7<-eoPgw5OGyJm4uU%6Z&$tik@=HQ zzr)kz+G*jpbz92b@|&gH-i4&+2W^SJLv76>*BZ`M(pTn7iB)UZ;(NV#T}`^fU7@^&3XJqiQz;z! zT33g&IHQg^WI4HnK_ck7l0<|4EIApv-jyMo=D2V0z~vo0pR%2!dc=TJT5^O1L2%PJI(mEk zG&kmaJ8A`0qkuZz0VJaGK#TUgks-l-$^wUs~ZgxurVG63kxIU%>_C}(;zgsDrSS)*3ksW zX0%v=tfNoKBGfj37mEG}^#I9J9z+)f=Q%Gw2HzQZQ zjcfO19$~cL8F!bVqEZnAqpnM`S_!$@^1GLuJTS=awX;I|di}HmXg@xUMBU_GHvLz= z8gM~@Y=40NGYUF;S}<`!DGxuRh-Sgl@gthcNq^6n0}Ndav3ro> zbzj%(82+c!=(MLVZfujRNR<+Q@_rxmR1(zlAky-ET3+xOWO6|~jp2TSx#?ld!v@;P>MoGZS z1NM&uD+7F}o3I4(_qrFW%QgsT#0{3x%R)J;D)?VyDizUc)^IG~sY?lgMC> zP1yOJTIolzD`^mD?3OY%kccZ50O*;a$djN4H9q^7h4fJ11t}=Vmr?zg-5CjpsuVKy zSl6pn3Ac1`&nEwn6!+)$%7OI7H&A0y+v-i#zX9VvZs&a}c%|D|WtB!>m&;3c;LjP? z{I$bXkgY}E)ad-DR<@E3D*fjroPzqMZ?B&R`2?r1ypCTui5yekS+Np*`gi6DW5FGu zlR5;cHy9+Hoy+}E!tH13M4nD7jJz@m?H{FsK@{BqVOBTcdm<~>dsLU0aYp&Ika2ge z;_z_Lc6sl*Lw3n~q%0z+0VK!(QVK+mx13v#~ z?2Cf81PRC&{9iCYjY6KQK0=1Pq%N}*vCGg#f4W};C(@AG8 z<#2x-rG1%-UhfVoW7uJl->yGexW>1mK~*w^%7O2t9!95Zl9)Mp%I}H~7zY)-YEa)! zjV>U|ThwvimVz=1)OF-tAP4Gz%=gviBh!Wjm_?<@fQ6|oW4d0Kay*R`o*rUe2Wn6h zBXe=E?!1C4&SE+ z7jzVZSPiXh4Fl}@7T;fhqZ)ZMb8L;!QKJa;`SEm^_X+112#B+vcCsNRBq#huC|oxh>z zIe@N#n_I>-8hCNWyRawb8|NLgC9MG%$|y1arkmV52th3b)s?ZPq&9}TWaOD zRq9m2+h_jP4(Ro0?2f|Lur_E=SDd{J&}P1M18?j2VD02tPGQlVh1%NjY*%aQWmiul znK=@y5YT=5=JGdx2BZ?)pKlpp?(y>FbDuajAIHO9f>5@X7q^3G56;JCriMyeH@3>iEb6v zD%7heg(v|uM?v2*2E9u28c`@O9^~0gn`s5~?U76Xa=)C-A0E)hE-Z}P3K#>3n|GK* zrN%oVOVZsyt3k~edSenT7Sz&py*oug9V8z~%3|rcXswsTUoFCIgTbc%wa_d_K_5Sn zoCnf?T0itlD3<_tf87uo9wLhB6pc~PcWN-c@h8UZ+rxpfN#qIZyZEo0Yzcy^!U4hX zql>|TR!dp;|GoU9U#u)VPtVUut?7<>765Xe$>A}-<)^&p5Fh2yOZLN1s1t{Qr^_K` z4O1{u9g}-b{T*Nn`t4qWmcPrO^QI!x{potK7s%2&N$X`udh~h;9Bf(PpK2A*-*@r9 zYFCdJ@qPvkza;v6V%^XKwDQuw-n=WV>2V_u8Z>}^@5S{j1(Y9-Ke756N5k*{d|g}Vm8jvx9x81(OOgD zWhbCIXKmQ0CJFRT>uy6p<%EKccy>oU5^lKO(BbT*OIw+WUgXhDM^u(9b+(GMxD@b6 zX%*BFRrT-%Pd+z6XHiSR(^PcgoaIPFgU(DwIf4;XTZ>|NE?y{5@T{|F{0jQuE_Vj> zJKGxl-Lm6}3810>w!xIKj>*y@bjFu7p_H^TSaq*vTRU~e#@S7JTC2R zc}u-NBqk*+tbJvTrH!U$<#TV|z;EF1Fc=paw=NcmY51~?Re0SS968bZb?789nc-Tn zg#fLW(`Ea)EV)Ie0UlAvCs*J`SG?fI%a;ZtZ6s}%@7}+hkX=b11RZiGcK_aYe7s;~ zXmoyeVjfRB2e6j_2J+*%dk*N52{Le7Niz2epHr2QU^j~E1JWP`^zG#1Ce`{wJU;S_ z5YzSI_1JH7gG-piw&GI`18lP?QdAx2f8AL$T0Hgb>rk(DWwGy4T%pdY`m^wxeSL2t zZ-L$kJ6Z-@pC6DkbmQ z88c~h5Ul?gLXK7Yl-}_%`n#b!c@Bhj#AG#bPmvSvr!ODW^2+A>UpLtjanz~YsJLlx z3aUD?-j-hNpu5kDFZy^gY}fUf6JN*H%9El;HX5Wn7ijnj#yCCv)%||Ts`^)ktBbsy zL$%ICGOfO;ag8GnRs6^v2ql~JgqV>|M+ZOmU5yl;`ysK~zrxf&i||PRanV?2nu@or zA$AbQ8Rzz33$;B@IY1tOHE7bT%U=Cn&~a-mcma5Oy6Lg-cYM|H?2wbA!lwl9Gyvuk zZO<)b&lG~$-!NRidsmH~;AE9y;VaD?-X5BL{o>fSkJm#!Uh(k=FPgk2ev;;P+SlmL ztYpOX2o34Ow2GFDcM-!l&Eue5312fD@`93LkC2HNzklUL4y1U0`kTx0sW@SzEFyJ~+PMfyI33 zEv(e*=)*_j6Ng(SDIb>XY5#T}#M;O(fOp;NkAef8$)l%2%f3=S)t<)s((0-n=Z8+g zsE79T8qAn1r)C~M1=iG8uRRQwp-fvmY~~{dOU>uL|5^uVM?^OG-pRj=s)9&Qd6g2i z_sd8zXV$-Jb*VzcGKLq&%+`_Zp88BvSfzYSnJ-c4TXs^XQp|41D$2f#ey8?KUH-V7 z!yUKxf6}j@WcMk8oY?Z{xwJ1d13P_gWhDIFWNs}8pns;`AZ>5#Jq9{uz?Y6abggR{ zhYr{6qZ@71&lfEdxVEWLGhHlPdGuA)HYsQkeNL4--az*S5WBS_zh4nsCQjV@7NM`y_tXN*Gs#9>*j(WJt&k3?TQ;jGwzcIBR>r7mn?t&igF5;#A- z7pEBrMgsZF1*`C`;#W7?`sZUj-P!=G6mU~XQ-`lDeiX1V!U821NjMkeXj(Yc)iiqb z%G+b9_8m|Ui`zu5)J4&h?6Iz^#P3&mshfG$Wly-J{1p_}?E0^v-IW)c0tUZs?2S73 z_4#4ef8gz1O;*2li%1RGVR-qDMHh#Yg92wg~%U`<8; zy_V~ePwaHRXSG_=Mh;8l=w|+P%TLN)knQ9k0ZSK)RrNt2z75Vl9Y-D~ zKA2#w<#IRMBm@k0N+ztce@0$bR6x@`a%Kfbn8cPp*qznk_#pk$m5j6S+r=2$+%nRm=` z|8}%czDnmFeBp3&wXX(5J7Nj5lca6aj}{xWDjNn?*2XgCxxd1&r+KS=+EDC|c|)j? z9kMJ%^S`^pLNMnAw||1PdEe8;hPQ2SSyX~MhA(}jg!(zlWsEcLb~G>$idKrwLJDFf z82-%hub(1Ios!~v+#@t*^k^%*Eq%+f%56^vr_ThkD6aV!HQ8}zyMq)u;UH?|N7wxO ze^yCq&%EWe5KwT1U; zY>juTAQqt)K_vlpwH%SU^w>R3Y!#pA77oOFN(iD4Z|Xy#udKz+gl?PySyAATJfVBL z#B-qwpe}oGKY9r)%m&m8;^(j~;a2wnOK|d`9B^)+`k(ePx+0+2yyE=D7D}y&OFyvK z0h~T{Y$VE4xTE&?%dyzF-2{_z%7Mx;?+E^)KYZ%T+F!V5cQVEv^h9l>ORp6Fo8i5k zgWID0WP009PS;~NIc^J~H?cLEi_3$Z^P8D6q^I!O&ho9hLO+GS{cTyy4D2LKl)Dt$VJv{~vV_GWBSv9GI?C&tC3(_|?Yf zRG9zht6~wO11pS=onNO}Yp%ESgiizG4~nT!?y3ib^`l%di!t>t&y;R(0d))!!t4ZT zo5i2>FS^y6vyWTMCG%4=E8Qo+jH|BSLOZbwrL|4#T~ehh-#QPCRr_h28c0oal!%(w z&S9yle%WhrWHN}lvSdGsL!=L7`g{uwd^$OWg2lRoA&I-{X6rE-VwRsYk4xQr!`eVH z7QAz==RX|?DguOB88sdchc$FvF|31Q+!2Uw7-yq2o)w&G)dEmXaZL zD0+)>joLGFEx8~2sL^8**)6Cs@msx-M_ z$bl7ds_n_jovrh61HoCoEJ|)H+*ZX&6Q8ef=-*c!La#s?k4&bnUDKq8Wy<1MmlFO= zK=S=DO=F_Eij&QDZm-0_s$8WqL6XrQZz_cjqv&2;(}8e?oGMABUeT9{ zm;?!B4=sK=W|2n;m3;J!LCV&WQwCk`5aQf=lZg&5n)sxl8^ zKo_J3;?DNTcw){shR_V+{W4a|P@+;BG0~fmNxNNqzdLIBmLtrj3;S+6tL12(&I>espWPr1 zF>dF39MkfQHy>DWJ_F!@;AKEDwoIAa%eEMr0}S?xCFr77vGd6q8~)nf(!EM&+Mqll_*O+@is+OsG zx8>?;_lNtH(t+ms+~ARw|5MzT212>F|KBKdN~m*E$k?@63W*p~6hrE05iuy8h@u+% zI;BOMWmF1LOp7pxEMqN1M;fLyS}di8Nf9%anJoY7o>8asJm);Wm;YY$W^Uj6{w~+@ zy_U}ht{!OgbeJ>W#K*FD{WB=EZVHLkE2^~kpn?CkatY}=^loW+Vdt$bs>FV%9KG+C z;LV0h%YppO`|l*ph7%k9B&DKA&%FAeB^p8K++F4P>XVV5%<1BwyP!1Y0on@jnrA%3 zk6HVd9O(4vn$X^^S~(1NbIn+YqXi6K!PI7`%Y(d^Px=rWr z0wv<^00QK;aO`++J>UIPfA^t3!XjWhjrQ*=AEV{?ZCxAI&*z)^ys>rlC}-`BAg(F9 zWV=0kY|63SHJx*M|6cS;qX%UbH*8@Xz^EWy2SMbUu5)hhyef#(!j15CR#!?6#qn-j z1rNwl9;Cya2H@&?iw)f)4?w z&}RKVQzn^vIrhv^IuRX2GRb|(PA0?a)qpz)dFB^rB7v}!DqTi*%uS+MBK4O~k|!CY zBXh2-h8*=;6Bz6BUg22$KlSUHCXM_!tI4l=WD@{WMzD4pDpNIPWqu6EOuhN=QsN)d zg67Wz=I%5VP%XwOajnNP_GCw04YNv}<4slgGYoek)cE|M7xwelV}dZ#hukNHkC-5= zu4Zfe5gAm|{T2_^ccjf6yC?VR+Tk-9Q_$WDpXr>!WNBm*I3d#ynw_JtyHUyB&>R5A z`NXGRB6j%=FCz&m5VdU0(fkv{p>A2#@9FA<5+u8NkmrQC@C7zv3tj{q#oiP2NYuXy zcU*iU*AGgkA<*U)LMW`NgnByirITx%xz4Cjz;54Qwxq`Bd*pZJ%M$1pgD!!*3M#1d z{h?vs{>(NqPOm*FROuVEZF#Y*+KZ0ct_U`$ay6~e!tD1`tlCTH1E#ajkCE1`nY6>_ z?k|Xl4MNY1pv}EkAYlfW)?Wmlcr3eLG$W}f%H*`bYX9`ej1abDLpejst>1MX(%J$< z3Nm?mb!aOIL?TBn3t9noDm9;RDgmF^_GS(#94@Q{$ulB{hldh+*ZM7UC}xH#i64bm z(dvGYOob|3zR5c0SFY&WDyoLR3(1CvS6d-ofEr$=(^XfHJwnj}tQ|(kIQn^KP^gkJlhnV9N-36Cdd^`5OeeMY2- zgE0%iRR>&{8x}Bl)wwKQ_i3Ww<&m76cHau=5wk5LjV&TE&cYAvrdePN(F^*5gJ|ND zwpLi)=o~g&>fWVt=Ue_tZ0cJyJ1`u3B?uCe#!HesdDomLqjW3Y&+Gk`cevBbIDu?v z<_k`MEfXLEj3jtIIna9r?g?2@x;k$> zyr**wFguP;Vdm01`u>_PMPMWMXY=B(6p4JIv_*{U*>+#l6!$VWf^L;T8*y*5;>gLXu_g$Nf+}04cEDu7@=38efFvtW#PILqKQ(0u77hljEiw*DVq5)MdHsC&oJF z)5;BMSSILZ>6?bi8v@U&+~oDeT~2bG*-p9g%bFi5q7~yx!(T%XOEOo4M*&GOOqO=e z*|t_NC%wZ*_m-U1P0_on+*`cCP#H>AG})TW0QXF6a@;BCXFL$n#NRJKWbxZKyxpnD zg7fY{N&^IMz?H#CQxpB~^{eLJ%S*IpjMl3qycyWv$x1Oq_tI1@q<{ve7433d&!1+5 z2M?ON$h9POVLxJcEP@f_oeL@+7x4{6){I)MY6Sy0w;sLazbAKVP=Eezv$V@=4W5lq2K{f`UGjpSM@Ga4h+w+jcHu>g&KlfWk3Tq$YWmFzVxO%@!viy%%|x2ZIliy`%^B$5X0k1cuE6)k!ZwQ zqElSoTE)46TNU2^Vx6`N;JLCP=h7Cw)^vLO*Hz2EMjv?bmpmxBYRXpUf)^WpH zWseO(u`i1v%U1wA7D6n8Cdva-`p(y*4hlo>$HX4};V5R!3f5VNK2X~;;p6(1*dDJC zABV1l`@b)c#+bg!M*`U(KubaTA*+I3ZGU+4Kl7wUqodxt|EWfA?2gHZAkgeA9IpBbf_?fGGM2LESD! zQjLJ+uzGwn!{`B;|Kp$Q-^l;<^M~;8?kO}T{jtB>ll@^cDs5J2?@Tkp&89bhqP3(* zFYgxLziM1#mD{-K_%#!uT1@aXr^}?%s}uGdBh<(M4A1&>iE16pVK4rEfptZ5-KWRH zr!G1QGGE*k#SiIC0>cOvy5qwVMgy;en&Q^iR$Zp!E(!4fJE*AsBU$?Sj5jcB(o~p{ z#}bQnM8`kji-UZnJ)_r!DVqtUK0yZKhsW+(&J8zn5?Fk+=s2Y*u>7Sh>Y80ns|nWu z$iGsZeUclDlszy<2)GOA)vU}|BCIJKJM%ZaI(a@3FO1OB@6=h4e_iDKfoJj-V#AT3 zjBod|)NWfT2nUz5a%J+{JEb6}t(|O)=H`UQJ~ZE`j{iisH&BaCK*McGERRpzlzjeb zk{2sywSh8Z2I>N2R}0H^zN0vSSIX>x${de3^0(EzSvmHSRU%IcKLz5MkYe|T^X+4) zAxJ|DJX05GNVq+uFR~l&3w|bl$`QN0)&G(XL~g`;EteW$PK$^1YZ(cY3)HPkWki3; z1#iqlru8jJr~Wy~l4y5*Ho*vU6Z<+|c#75yi?@!9o@05qL;e}euehm?Q*-KZIl6-b$U;kw?T#%?r~=ijU=OiFGU;q zI$n5A{&kFA))!YQ#Xz=xhuCl&T05^#MRxIHsA=#e)a#V?|)3- zVW~lpKiI;;>6;=UAyZOahrL;M?a$tZrS^7Wgb|ps>wg~UGh8G-@{HzBLznqxjb!ot z7n<@FhXcMA{uu2@ntfGTl$z|vx0l3cMSl(Xsvq$EMUiPL*mS{92F2nZEXY-#Xff>| zE&)6*iyudt_C&v~m*b~iwSrwsJ%2>yo;Uzgs*yXt&|@LK?EFRb>+36hhP1EjG0bpzk#amb15P+7AwSOLp5Bq zP(V2guld5VN{{Bw%m zbKHy(cfXjCLxQR24p^#^^`oU*prJauLrXueID4$PJ=;eBz6*6n6AAn- z=n&Wh#cD^kzBtO+>lI%T`F)EHbSj&)ccM1JWNa&QcIhIb*f0~G-os8ST{mk4Im$jcTI70|1U(pBBAY`?cVNnK1ZY?md?HhE+OjEtr?cw z4?^buLWSbQyz4?|7+NVj35VYJJT;FMmdY*hSboUeb$;aOt-it)fAthJ*TGS917%%$ z_1?2n?A=f~%5Z~P49&ki)?E0siQ^Xx^?jSVV6G#}@zY=)7mu5aJN>W<>*&ke=+(!0 zB}1tTGeoWhpMgrFUQV~?r|*Vk($pdxJ1u^?j3sZNe9`9}G zr-ih|<7|!?DBIO$e<@qq%Z5>3sP?*O9w4Z9ect(=hI9!oGBl;nQU!kT%&5wcVTmZ0CWvfy9zwQz`P$--Vde2Q@mMcN&$C5V=QQ`YdOX^IZ-nTWY z`1hH@F0@P&^%@?I9C@|t(V+ru)+Og|wFj-v`vX7u>;M^w)A&@%(=%xNS>4MlJ>&-+ ze2Td*-ZQ4OTS+re9le(as1GlD&kdJ-)QmuM872e_5fK|fGbe*j>!L6I^$`tI|Y?l4vG%?Np*|7 zaBBg#wwc_?rp-?W59?ozi2wV+$3*-gsAKj?D$}Wvz%TIS6zuUb8gVlJ>#zhA9L^Ja zsuFhso&ty_O(^1miZXi3U*;P%GxMQ9JqnbqiF~{^Kw~DA9=|L1Hxc+*Ql@yBLy8OD zKKx_F8{$p$t58#4sld-+=PB#qN&SCzwnkd6d$TUIi@<}>?6L?S1*N`j_5Wg7 z6#0cisj};FV)ym^{0XGEe>N-ai-`40T1cO9X}bm!c0zLz+PE>`_4WLh?$j9HyBe1Fl?#+i zGzru46hR#`Dj=OBrNar0?ZvMjz0IF3AHM`tn+hItjBsYtKe}R17nKa(1exrkNn(Z) zk~{hda_(?z`JX1I*#9had2A9}Q(l6ny$X=M63`KTlKV z_y$lvXG%N$>Sq$^e0RUe?;5nZ;$}@vm6a*BD zJ|6dX<5U7SoX>zz?wS_$CFDAo3!K=R^lGyIb=c_lAGC@d06ZL9u4sHFJUhu%sP!34Q2KdYspcICro;#)}m%Jdc3t0{MV4i;_U?EP^m z@(gj{wuM`Mz6i&6=E2^5_*Kmpp%b2#`B1m`yO-SS_O}a-$dRlFX)l}!+4DCet=!dn zT#f#0Hg0!jah{L`O5QXGge0>HBF&-A!?CBnD7Ir_dxQIAq^wIKZ5ex+n@V2>aAcon zN(mi@^J;MQIW!3U?BTK2d^=EvG2#>usR)~dyc2@#(*H0`_SDErJ!MNxHbe9Bbk=Q; z*sYaMvO^XvLP02m{%epKHC%m7ac=Fpj00QGD8Xv1dbun9FZ2z8^^&5VX`+(Xd7j@5 z@`i^`Sn(`w=XA!N+2H6&Jv(dSi=8Jm{Bqk5A4S1Z;*B$;kmF>sF=m+}?1!ZuRg8e8 zRR8~$q-?JgX*_KW{T>86EE~OW{Dt)^8vjj_{7<*ViL{Wo;EVUG6W-BcAENjDf4ShO z$n1{oJ<=yDWnCS)sae4wn)$Epn?eW&;N#r_36}Gq_Z+;KI~s5{VzK{v$I&039C|B- zPOZz&nxEXSnlp6l=etZA*s#HQRhn#2k+O5;n@0xLCm#MfSbcP-8fCk{A(hslu;450G<+o==dHxIc;iQN=g@@&wC zpVP1EGW6e9AcRR!;R;_K%)k95M;uY(O3oBP-Qd19H8G z;RaAbe*fEQdCs2(G>Gb>1j`&R+}q&G6d)_wO1%9TkQ>L}+;sMn zVbl6W#f4%`WLGvV1{gZl!O{V#L{+~DpYhLOn2zXeC3(3!8C%jd*@J*`6GyvZ za1i&{&f*)jNZI<)vaagg7is;O@gW0c3~G?&z)@CQTHPxrZXQMH zsPsbNi~w2*1V4|gbCh5ur>Y1XM@MuRoWWZ?#=p)((VFDcBVGo`a{5BQf*!yFo)Fb& zE`r>N4cvsoG+Pmjs^@*np`-^9X2k;XS3WoqtJoUUey?mOvpNMq@YY{%t4_t=mW=_W%Ctw8UTA~o0{kTQrQBzp(lyK zs*4b1tn>A6G+(TPPUdKBQv*>W_)*HXMbK#1rNcI+_P1~4*qyx%U@P^$DRCpwY;?~$ z4*_qKQ7|Xrg4VgSm(&lWr;ccaIG8a5WUorCRE`X}MoA&a6n$YDAf&lcvQdYEW0fO9o^V!Ad#UH!RcD#BIAEFlg_<;HO z!+>qI7JuN1LjN8HMP!Nei6@V~uEe;Un~g}e{@&a$oWPRaIu%YfaMP3@83hDjxbb*3 z_-;G@rNWURMLpksF1v~9I7b9Id7y>mLCD)%$}8Q_>>>$w{h^j|yfi)O_?=^U-xD)! z?lucW5$G*!U}@NfVz*TeD@erv@kHnyimeN?Kow2MFr(Rk$)LMp782YK-Kt9~OJ_zSuz#^ZwRS> zqn>#=M*lN_f>f)rt3f$0qKfZGy96v5AH2qN7~whNZKm0-Uucs4wdH=z1zB#F0s3g0 zKcR7Jsp1wbF|&&h#lM^v{zV+^)>Issw&E1Luk>b_NS^!>r+^~T`d#w>9q{>>_m^fz zFPEBw+}Ku#z18}O$2bnicc|PE?!@^3S46Mf7@lngJ#tw@sv_<)K$#p^t~U2ya}emrt}?y z%?$)^Uz0n$81RetLjuGT|E>H_=WqKmEQJkbfLTy%A%wYnqD|{Y^$yfq+1AZ)Mhy#^;LYExwp$^m}ZaXlc^o`u9F?GPH0xwW++uKW# z4K3zx1n`N%qZROJKAwJ)M}ls{O1OsJVA-)NyABJGb%YTg0C3v{+ZX&y1VH1VE2nA? zLl^c(Q`dM;6o+pbH}GRSPdBHu=D`LwRZjmJ?2*(j>i#&-CiE_)GGdbSz|WDezP))p zplZz=>e`RZeJk+QjBneH?{*Y<2>dT`iCkZNT)#=!m+le=ITSieC?7^!Ixhg~^KuZ5 z%CYoWc>v{X1ASUH{M~rz&ufB;Qgf<5_*0Vb#ro?MV}WgAJ|>SY-k&`&9wq@rGQAHH}r>K z()V_*^GL}N;tYFFKbH{$5a{e>&(jmR3WZZ;p^3kBmPr8mrtl5)gPr#Gr<~JvRll0L zqXKy5>+XTM0-~wHiEB%)cz@qy(`k+lglTVarY-A8V<^J44%;7ZUi#d;Wh8TQW~?~V z!jPz}161U*1o%Ylyw@z1!z%@{IP>YE3tH#j0G z8kIW@U@gX}SGW)bnW_m;k(7p?E_=4!BI_I>K%(_()9fCiNecj>`hzk%uU-i^MFhEV zd3P-RBTjb_luYYQcBFT3s|F)kSwS`?4e0W@H=z3mAZoK7U4iWEUTCJ=B?vGeNcUY= z7=5r*NAz8$$c8~MkY$wfb-hvua$d+dP}#pxMnd!CVqiDYP2g77dCo@=TW`EBtmXpd zDP^TC;;Vr(D{3P{p}x`zK^*gQSY{YgZ@K6Uk%s{4+o8o?(+Z52-HiK`-d?9&unt3j zYTgZK9kTda6c3bQ33qaU%Sr5c*T9X}hj=mhIqU>!^HY~URsni5sZGQ;Vg8KMs-Ol9s zNKN2;+t3YZyKVs&S0(_LhX9~$62&~hA7DcfM6Yk9w@w*93?{H1DBN@bZQyir$!+sS zbki3PFUOn1!V=zhziOW%7lfeb!xGP3@~3|0u>O$z38p<{M#aQJ-geT z+e{CPZH7N8%n&)g8;p+y!xcYGXnv0RmUwM;8#(e&_|{n!FpIAafYq7ke~r?E&bktLheio`vW>LZfJG7|k2CJFn;(9?DUUfoWDIcTFoy<2xQbulo z;9e+xn*-4pq#Il6$VhDH)l+tKIdQ5R9AOu{A6dB0?R7~SmC7K+SPrmn;o%j53x$`yyu(dL2bt z6GdWBk~UTPicYsv%UVgwHsIiGXE@hsI3c9H5jz=i;HlZeHc-(K4V1<)E6>WAiXf+t zWlVJlE~bS^N44PNGYfZ2Ks zzy9WOVz#w>`eKx?PGjj&lyEG}>P6~~XSaFC?E+EJ99YYq7pC$HoPp+)+c&zn%B~3kVDlnyQfKK$&O^yKF)3RAxt_KXTs_$*$m9>dvKuU=7-0VH@&GsOcG>|VU>JN~8T6c||%os3JQkf!|3v`d2{WKY6 zgB;+@lTW`}Wyhe~0{37j+_}HeC~omwD6qqsJBo;eLfb09#kw*C!U%a&?SoMQ$U;e( zHNba=;w#!RPLY+mVOwi%W7XIvVCZ)+G+}S(zG>Cn@wYl$P;WbaDZw)c`{xz*3&R*o7HBW@xk(D0s~f_ZQk^ z2>kYkq)WJCW_Tg5054=-ygy1#NRoBi#j)lv0gx>lNFP6gVeJMtV^Evjt5NC5SPfr} zSPhWV*|g%4a}B_QzKKibF4eI0dpftkxPQPN5sGe`cu6u zk&`}@+e72v8DQT5J17Uvrzo7y=r#k@Z6u=7DEZ>Bi#X2t`KjyhWo zo&dNeF+|%==K;D~*a7(ajtuyF17AxZZwx^xPNk90E!W95KxPWT7qJ@{AaATe86Du` zsw^32(UsQ@cWT~|>x!yLSos!R;0_f9IHTMdiw6Es zXzK%IFQtf51eJ zpo2g_sq5ZtS)T0CS`*R$=-;?DXbty+ujp0+dSLuYqnzrUjPvT(Ss*T*<@O8(jY=R$ zro%d-B&o>l3xf-JtMTR4@)DJAfa-Jt<-xs-5M%4_)l1?;>7%xv(x+%+bL%G>-y=Z{UdmC8#8>^r{TfM*y_Z-=D_--L5{Y zhN-%>fab2v zb|NdWX-dlO7@%OpM}gYvin zfVVR!D1ow}-4myMiWV;3cw2Jka<-p(r7j9hyh)^H)w-i%sP}Nk#>9#dbTO)dR`Q)Y9~-5OH@WKBCg&n2j=Vf7I$OZpok8)le|{-7i^a(GTVzyr z1`1#>iClX;^WMR=RJdq0QRj*wm{y<>hp3hrfw6?l7|PQJs_`*@fs$x6aV?EW0JQ}^=~n?q5%fZc z903ED*k+(Ey?8pbWjuWh1Kh`y+01~@ed_GF-kpk(l@z))|HXKEdIC3HkoB`hVo;Xw z#ZbKIiyyOpej!zp?GI-l;_zq(I0(Es=3#s^ ze|FjX+p0RVO2hA8Eua4=?CyVlvFFncE;_d|>PqeI3<@^{W>|2y|^A6LxOX|FGAiD_T<)XGHn`oheeeQJOFirRlF zFW4Qh`cjeXEM)16Z4*0wa_`*jfgw|hkGoscxUj~}p?k?eZFm}pRpgJT`pb36E?|>-99Ogf=nyPXJ?-_5>oQL~?sQ_t5ikzUO>PGItrM%?DmUNs*!JUo^EvCD z(~E2Qa=-qmNKW|~@b0#3qx1J$Cq6ZP;A;B3OJlu4eZ;Rh&qP@`Bsc^N1QZe!91b`% zG&C|WGBYyOu^-&{uv{P^9*Z0s6AKSkO+!~A;e6g(P5YibmY=?yU{>A{@hth%nG?~< z_I*2!7j(x|yz^Us?(4+;Jr4|QOpB6_*iKtr{BWoBUZc-bn+s*;Sx%bob|-n4k@&pb zm$i-WhdngdYx_v<^3HgjG*K);k_WjM^7#OO7nPWI1zT7?Ge%(#k={J)U?!W0fu&;Kn zwch5V4*&LBGyVQ{^WBa!V$479zvFmw`_uD#SML@swePPnJS5I=WBF`l|DHP*JGY(? z^M9o8Znx*J`UZ3P9v#`^TaId<`10dKjs1@cCv_8|@AukRe!6;cZR@rw>5|$fOK;aR z&HnxT#HT`^>t)AvYpg!~J#pVZkMVXz>6820|J(TJ_nn!3Ai728%y#Af5|&*3y?e}! z_GcETd!LB>eEUSbo1E;;J7Myd{EhAR>^Jzded5oBuO?3X?cQ+tOud~^z2f}%UuW)H j-jk2~mpirm>8ba5I^wxU&U|qKR)-9pu6{1-oD!MOV%)fi;J>`G%jw)8gjVE${JR2aaY!G0~hnM zhG|@UElYTe3EXtc3bxQs9yfX7vVdw{;WqBh$^xF`2P*M9I}|qJ3{e@6PKArjoMZ`q zzv59!fmanSI=PO&6?&+plSP6ovR7f^QNATeik(_R0|VqKmg6Jp6&~t1O&))jcuMQg zz!ARWI(NwM6X$u29SRTC9OM@M7CFo&S;iB5kG}$E*e=U>kWUFR#U6!^Dg|IO$GL;Q zdG;$z?BZ=E`Hcb|x0vJv&02@&xrVwOhY7LL@4M9>gD@+_--REpnJm3KuU?nF43nuCUR}5|x-@k1XJG+|9FJHqb%=H!GZ? zR#tEVHz}HB3FEjJmo=nuF(+%t;UXt%$l)REk1CR+@t5HZYGfZVddcE%mgiK277p?u!wk{S zAzEYsZHy7*0=xAuo@I(+(gP_7Qy#3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_about_items.xml b/app/src/main/res/layout/activity_about_items.xml new file mode 100644 index 00000000..38125a3e --- /dev/null +++ b/app/src/main/res/layout/activity_about_items.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_error_report.xml b/app/src/main/res/layout/activity_error_report.xml new file mode 100644 index 00000000..2a656d5f --- /dev/null +++ b/app/src/main/res/layout/activity_error_report.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml new file mode 100644 index 00000000..172dc6c0 --- /dev/null +++ b/app/src/main/res/layout/activity_settings.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/divider.xml b/app/src/main/res/layout/divider.xml new file mode 100644 index 00000000..6ec7be66 --- /dev/null +++ b/app/src/main/res/layout/divider.xml @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_slide_menu.xml b/app/src/main/res/layout/fragment_slide_menu.xml index 7e7cab44..d56fa5b2 100644 --- a/app/src/main/res/layout/fragment_slide_menu.xml +++ b/app/src/main/res/layout/fragment_slide_menu.xml @@ -5,6 +5,28 @@ android:layout_height="match_parent" android:orientation="vertical"> + + + + + + + - + android:gravity="center_vertical"> + android:src="@drawable/ic_service_green"/> - + + + + + + + + + + + + + + - - - - - - - - - - - - - - \ No newline at end of file + diff --git a/app/src/main/res/raw/licenses.xml b/app/src/main/res/raw/licenses.xml index 8b61d294..4e0bc1b2 100644 --- a/app/src/main/res/raw/licenses.xml +++ b/app/src/main/res/raw/licenses.xml @@ -12,4 +12,23 @@ Copyright 2008 Google Inc. Apache Software License 2.0 + + DuktapeJava + https://github.com/gubaojian/DuktapeJava + + MIT License + + + 920 Text Editor + https://github.com/jecelyin/920-text-editor-v2 + + Apache Software License 2.0 + + + MarkDown + https://github.com/zzhoujay/Markdown + Copyright (c) 2015 zzhoujay + MIT License + + \ 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 0825a769..17b030b1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,5 +1,6 @@ 免Root脚本机器人 + Version 1.17.0202 设置 关闭服务 使脚本自动操作(点击、长按、滑动等)所需,若关闭则只能执行不涉及自动操作的脚本。 @@ -32,7 +33,6 @@ 设置 退出 自动操作服务 - Version 1.17.0130 语法与API 关闭所有正在运行的脚本 关于 @@ -41,4 +41,23 @@ 示例:打开朋友圈 示例:打开正在运行的服务(安卓6.0+) 示例:简单计算器 + Copyright©2016 All right reserves. + 星尘幻影 + 946994919 + hybbbb1996@gmail.com + 软件源代码 + 已复制到剪贴板 + 打赏作者 + 邮箱 + https://github.com/hyb1996/NoRootScriptDroid + [免Root脚本机器人]下载地址:https://github.com/hyb1996/NoRootScriptDroid/releases + 脚本辅助服务 + 通知栏显示脚本辅助开关 + 通知栏显示脚本辅助开关 + 其他 + 脚本辅助已开启(点击关闭) + 脚本辅助已关闭(点击开启) + 错误报告 + 大姐姐好 + 再按一次退出程序 diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml new file mode 100644 index 00000000..759efdef --- /dev/null +++ b/app/src/main/res/xml/preferences.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + \ No newline at end of file