尝试修复某些设备上死机和重启的问题。修复在4.4上无法显示悬浮窗的问题。增加英文语言。增加获取WebView内容。

This commit is contained in:
hyb1996
2017-03-21 18:55:27 +08:00
parent 50d53fdec7
commit feff05e11c
28 changed files with 425 additions and 264 deletions

View File

@@ -1,6 +1,7 @@
package com.stardust.app;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
@@ -16,6 +17,7 @@ public abstract class Fragment extends android.support.v4.app.Fragment {
private View mView;
@NonNull
public View getView() {
return mView;
}
@@ -36,14 +38,9 @@ public abstract class Fragment extends android.support.v4.app.Fragment {
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mView = createView(inflater, container, savedInstanceState);
afterCreateView();
return mView;
}
protected void afterCreateView() {
}
@Nullable
public abstract View createView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState);

View File

@@ -4,16 +4,35 @@ import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import com.stardust.automator.AccessibilityEventCommandHost;
/**
* Created by Stardust on 2017/1/31.
*/
public class Pref {
private static final SharedPreferences DISPOSABLE_BOOLEAN = App.getApp().getSharedPreferences("DISPOSABLE_BOOLEAN", Context.MODE_PRIVATE);
public static final String SAMPLE_SCRIPTS_COPIED = "SAMPLE_SCRIPTS_COPIED";
private static final String KEY_MAX_TEXT_LENGTH_FOR_CODE_COMPLETION = "KEY_MAX_TEXT_LENGTH_FOR_CODE_COMPLETION";
public static final String KEY_DRAWER_HEADER_IMAGE_PATH = "KEY_DRAWER_HEADER_IMAGE_PATH";
public static final String KEY_APP_BAR_IMAGE_PATH = "KEY_APP_BAR_IMAGE_PATH";
private static SharedPreferences.OnSharedPreferenceChangeListener onSharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(App.getResString(R.string.key_run_mode))) {
AccessibilityEventCommandHost.getInstance().setRunMode(getRunModeFromValue(sharedPreferences.getString(key, null)));
}
}
};
private static int getRunModeFromValue(String value) {
switch (value) {
case "KEY_THREAD_POOL":
return AccessibilityEventCommandHost.RUN_MODE_THREAD_POOL;
case "KEY_NEW_THREAD_EVERY_TIME":
return AccessibilityEventCommandHost.RUN_MODE_NEW_THREAD_EVERY_TIME;
default:
return AccessibilityEventCommandHost.RUN_MODE_SINGLE_THREAD;
}
}
public static SharedPreferences def() {
return PreferenceManager.getDefaultSharedPreferences(App.getApp());
@@ -64,4 +83,23 @@ public class Pref {
return getDisposableBoolean("isFirstUsing", true);
}
public static String getDrawerHeaderImagePath() {
return def().getString(KEY_DRAWER_HEADER_IMAGE_PATH, null);
}
public static void setDrawerHeaderImagePath(String path) {
def().edit().putString(KEY_DRAWER_HEADER_IMAGE_PATH, path).apply();
}
public static String getAppBarImagePath() {
return def().getString(KEY_APP_BAR_IMAGE_PATH, null);
}
public static void setAppBarImagePath(String path) {
def().edit().putString(KEY_APP_BAR_IMAGE_PATH, path).apply();
}
static {
def().registerOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener);
}
}

View File

@@ -2,17 +2,12 @@ package com.stardust.scriptdroid.droid;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.util.Log;
import android.widget.Toast;
import com.jraska.console.timber.ConsoleTree;
import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.Pref;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.droid.runtime.DroidRuntime;
import com.stardust.scriptdroid.droid.runtime.ScriptStopException;
import com.stardust.scriptdroid.droid.script.JavaScriptEngine;
import com.stardust.scriptdroid.droid.script.RhinoJavaScriptEngine;
import com.stardust.scriptdroid.droid.script.ScriptExecuteActivity;
import com.stardust.scriptdroid.service.VolumeChangeObverseService;
import com.stardust.scriptdroid.tool.FileUtils;
@@ -21,7 +16,6 @@ import java.io.File;
import java.io.FileNotFoundException;
import java.io.Serializable;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import timber.log.Timber;
@@ -102,7 +96,7 @@ public class Droid {
}
public void runScriptFile(File file, OnRunFinishedListener listener) {
Timber.v(DateFormat.getTimeInstance().format(new Date()) + "/" + App.getResString(R.string.text_start_running) + file);
Timber.v(DateFormat.getTimeInstance().format(new Date()) + " " + App.getResString(R.string.text_start_running) + " " + file);
listener = listener == null ? DEFAULT_LISTENER : listener;
try {
checkFile(file);
@@ -178,7 +172,7 @@ public class Droid {
public void run() {
try {
if (mScript.startsWith(AUTO))
DroidRuntime.getRuntime().ensureAccessibilityServiceEnable();
DroidRuntime.getRuntime().ensureAccessibilityServiceEnabled();
mOnRunFinishedListener.onRunFinished(JAVA_SCRIPT_ENGINE.execute(mScript));
} catch (Exception e) {
mOnRunFinishedListener.onException(e);

View File

@@ -12,7 +12,6 @@ import android.os.Environment;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.util.Log;
@@ -201,7 +200,7 @@ public class DroidRuntime {
}
private <T> T performAction(Action action) {
ensureAccessibilityServiceEnable();
ensureAccessibilityServiceEnabled();
ActionPerformAccessibilityDelegate.setAction(action);
synchronized (mActionPerformLock) {
try {
@@ -214,7 +213,7 @@ public class DroidRuntime {
return (T) action.getResult();
}
public void ensureAccessibilityServiceEnable() {
public void ensureAccessibilityServiceEnabled() {
if (AccessibilityWatchDogService.getInstance() == null) {
String errorMessage = null;
if (AccessibilityServiceUtils.isAccessibilityServiceEnabled(App.getApp(), AccessibilityWatchDogService.class)) {
@@ -263,12 +262,12 @@ public class DroidRuntime {
}
public String currentPackage() {
ensureAccessibilityServiceEnable();
ensureAccessibilityServiceEnabled();
return AccessibilityInfoProvider.getInstance().getLatestPackage();
}
public String currentActivity() {
ensureAccessibilityServiceEnable();
ensureAccessibilityServiceEnabled();
return AccessibilityInfoProvider.getInstance().getLatestActivity();
}

View File

@@ -1,9 +1,7 @@
package com.stardust.scriptdroid.droid.runtime;
import android.accessibilityservice.AccessibilityService;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
@@ -69,12 +67,16 @@ public class UiSelector extends UiGlobalSelector {
private static final String TAG = "UiSelector";
public UiObjectCollection find() {
DroidRuntime.getRuntime().ensureAccessibilityServiceEnable();
ensureAccessibilityServiceEnabled();
FindCommand command = new FindCommand();
AccessibilityEventCommandHost.getInstance().executeAndWaitForEvent(command);
return command.result;
}
private void ensureAccessibilityServiceEnabled(){
DroidRuntime.getRuntime().ensureAccessibilityServiceEnabled();
}
@NonNull
public UiObjectCollection untilFind() {

View File

@@ -30,7 +30,7 @@ public class ActionPerformAccessibilityDelegate implements AccessibilityDelegate
private static Action action;
private Executor mExecutor = Executors.newFixedThreadPool(5);
//private Executor mExecutor = Executors.newFixedThreadPool(5);
public static void setAction(Action action) {
synchronized (ACTION_LOCK) {
@@ -54,7 +54,7 @@ public class ActionPerformAccessibilityDelegate implements AccessibilityDelegate
}
private void performAction(final AccessibilityNodeInfo root, final Action action) {
mExecutor.execute(new Runnable() {
new Runnable() {
@Override
public void run() {
Log.i(TAG, "perform action:" + action);
@@ -66,7 +66,7 @@ public class ActionPerformAccessibilityDelegate implements AccessibilityDelegate
onActionPerformed();
}
}
});
}.run();
}

View File

@@ -17,10 +17,12 @@ import com.stardust.hover.SimpleHoverMenuTransitionListener;
import com.stardust.hover.WindowHoverMenu;
import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.droid.runtime.DroidRuntime;
import com.stardust.scriptdroid.external.floating_window.view.FloatingLayoutBoundsView;
import com.stardust.scriptdroid.external.floating_window.view.FloatingLayoutHierarchyView;
import com.stardust.scriptdroid.layout_inspector.LayoutInspector;
import com.stardust.scriptdroid.layout_inspector.NodeInfo;
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
import com.stardust.theme.ThemeColorManagerCompat;
import com.stardust.util.MessageEvent;
@@ -165,6 +167,7 @@ public class HoverMenuService extends Service {
tryInitViews();
if (mWindowHoverMenu != null)
mWindowHoverMenu.show();
AccessibilityServiceTool.enableAccessibilityServiceByRootIfNeeded();
return START_STICKY;
}

View File

@@ -132,7 +132,7 @@ public class AccessibilityActionRecordNotification {
public static void startRecord(Context context) {
if (AccessibilityWatchDogService.getInstance() == null) {
Toast.makeText(context, R.string.text_need_enable_accessibility_service, Toast.LENGTH_SHORT).show();
Toast.makeText(context, R.string.text_need_enable_accessibility_service_to_record, Toast.LENGTH_SHORT).show();
return;
}
AccessibilityActionRecorder.getInstance().start();

View File

@@ -57,4 +57,11 @@ public class AccessibilityServiceTool {
}
}
}
public static void enableAccessibilityServiceByRootIfNeeded() {
if (AccessibilityWatchDogService.getInstance() == null)
if (Pref.def().getBoolean(App.getApp().getString(R.string.key_enable_accessibility_service_by_root), false)) {
AccessibilityServiceTool.enableAccessibilityServiceByRootAndWaitFor(AccessibilityWatchDogService.class, 3000);
}
}
}

View File

@@ -50,8 +50,11 @@ public class EditSideMenuFragment extends Fragment {
return inflater.inflate(R.layout.fragment_edit_side_menu, container, false);
}
@Override
protected void afterCreateView() {
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
setUpUI();
}

View File

@@ -32,7 +32,6 @@ import com.stardust.app.OnActivityResultDelegate;
import com.stardust.scriptdroid.Pref;
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.external.notification.record.AccessibilityActionRecordNotification;
import com.stardust.scriptdroid.record.inputevent.InputEventRecorder;
import com.stardust.scriptdroid.record.inputevent.InputEventToJsRecorder;
@@ -99,7 +98,7 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
private void goToAccessibilityPermissionSettingIfDisabled() {
if (!AccessibilityServiceUtils.isAccessibilityServiceEnabled(this, AccessibilityWatchDogService.class)) {
new NotRemindAgainDialog.Builder(this, "goToAccessibilityPermissionSettingIfDisabled")
.title(R.string.text_alert)
.title(R.string.text_need_to_enable_accessibility_service)
.content(R.string.explain_accessibility_permission)
.positiveText(R.string.text_go_to_setting)
.negativeText(R.string.text_cancel)
@@ -157,11 +156,11 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
private void setUpDrawerHeader() {
TextView version = $(R.id.version);
version.setText("Version " + BuildConfig.VERSION_NAME);
String path = Pref.def().getString(Pref.KEY_DRAWER_HEADER_IMAGE_PATH, null);
String path = Pref.getDrawerHeaderImagePath();
if (path != null) {
setDrawerHeaderImage(path);
}
path = Pref.def().getString(Pref.KEY_APP_BAR_IMAGE_PATH, null);
path = Pref.getAppBarImagePath();
if (path != null) {
setAppBarImage(path);
}
@@ -236,7 +235,7 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
@ViewBinding.Click(R.id.record)
private void startScriptRecord() {
if (AccessibilityWatchDogService.getInstance() == null) {
Snackbar.make(mDrawerLayout, R.string.text_need_enable_accessibility_service, Snackbar.LENGTH_SHORT).show();
Snackbar.make(mDrawerLayout, R.string.text_need_enable_accessibility_service_to_record, Snackbar.LENGTH_SHORT).show();
return;
}
AccessibilityActionRecordNotification.showOrUpdateNotification();
@@ -270,7 +269,7 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
@Override
public void onImageSelected(ImageSelector selector, String path) {
setDrawerHeaderImage(path);
Pref.def().edit().putString(Pref.KEY_DRAWER_HEADER_IMAGE_PATH, path).apply();
Pref.setDrawerHeaderImagePath(path);
mActivityResultIntermediary.removeDelegate(selector);
}
}).select();
@@ -376,7 +375,7 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
new ImageSelector(this, mActivityResultIntermediary, new ImageSelector.ImageSelectorCallback() {
@Override
public void onImageSelected(ImageSelector selector, String path) {
Pref.def().edit().putString(Pref.KEY_APP_BAR_IMAGE_PATH, path).apply();
Pref.setAppBarImagePath(path);
setAppBarImage(path);
mActivityResultIntermediary.removeDelegate(selector);
}

View File

@@ -52,8 +52,9 @@ public class SlideMenuFragment extends Fragment {
return inflater.inflate(R.layout.fragment_slide_menu, container, false);
}
@Override
protected void afterCreateView() {
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
setUpSwitchCompat();
ViewBinder.bind(this);
}
@@ -124,9 +125,9 @@ public class SlideMenuFragment extends Fragment {
private void stopAllRunningScripts() {
int n = Droid.getInstance().stopAll();
if (n > 0)
Snackbar.make(getActivityContentView(), String.format(getString(R.string.text_already_stop_n_scripts), n), Snackbar.LENGTH_SHORT).show();
Snackbar.make(getView(), String.format(getString(R.string.text_already_stop_n_scripts), n), Snackbar.LENGTH_SHORT).show();
else
Snackbar.make(getActivityContentView(), R.string.text_no_running_script, Snackbar.LENGTH_SHORT).show();
Snackbar.make(getView(), R.string.text_no_running_script, Snackbar.LENGTH_SHORT).show();
}
@Override

View File

@@ -43,7 +43,8 @@ public class MyScriptListFragment extends Fragment implements BackPressedHandler
}
@Override
protected void afterCreateView() {
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mScriptListRecyclerView = $(R.id.script_list);
mScriptFileList = ScriptFileList.getImpl();
mNoScriptHint = $(R.id.hint_no_script);
@@ -60,15 +61,6 @@ public class MyScriptListFragment extends Fragment implements BackPressedHandler
mScriptListRecyclerView.setScriptFileList(mScriptFileList);
}
private void init() {
setUpScriptList();
}
private void setUpScriptList() {
}
@Override
public boolean onBackPressed() {
if (mScriptListRecyclerView.getScriptFileOperationPopupMenu().isShowing()) {

View File

@@ -73,9 +73,8 @@ public abstract class ScriptFileOperation {
@Override
public void operate(RecyclerView recyclerView, ScriptFileList scriptFileList, int position) {
Context context = recyclerView.getContext();
ScriptFile scriptFile = scriptFileList.get(position);
EditActivity.editFile(context, scriptFile.name, scriptFile.path);
EditActivity.editFile(App.getApp(), scriptFile.name, scriptFile.path);
}
}
@@ -87,10 +86,9 @@ public abstract class ScriptFileOperation {
@Override
public void operate(RecyclerView recyclerView, ScriptFileList scriptFileList, int position) {
Context context = recyclerView.getContext();
ScriptFile scriptFile = scriptFileList.get(position);
Uri uri = Uri.parse("file://" + scriptFile.path);
context.startActivity(new Intent(Intent.ACTION_VIEW).setDataAndType(uri, "text/plain"));
App.getApp().startActivity(new Intent(Intent.ACTION_VIEW).setDataAndType(uri, "text/plain"));
}
}
@@ -125,9 +123,8 @@ public abstract class ScriptFileOperation {
@Override
public void operate(RecyclerView recyclerView, ScriptFileList scriptFileList, int position) {
Context context = recyclerView.getContext();
ScriptFile scriptFile = scriptFileList.get(position);
new Shortcut(context).name(scriptFile.name)
new Shortcut(App.getApp()).name(scriptFile.name)
.targetClass(ShortcutActivity.class)
.icon(R.drawable.ic_robot_green)
.extras(new Intent().putExtra("path", scriptFile.path))

View File

@@ -39,7 +39,8 @@ public class SampleScriptListFragment extends Fragment {
}
@Override
protected void afterCreateView() {
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mSampleScriptListRecyclerView = $(R.id.script_list);
mSampleScriptListRecyclerView.setSamples(SampleFileManager.getInstance().getSamplesFromAssets(getContext().getAssets(), "sample"));
mSampleScriptListRecyclerView.setOnItemLongClickListener(new SampleScriptListRecyclerView.OnItemLongClickListener() {

View File

@@ -110,9 +110,8 @@ public class SettingsActivity extends BaseActivity {
.entry(getString(R.string.text_reset_background), new Runnable() {
@Override
public void run() {
Pref.def().edit().putString(Pref.KEY_APP_BAR_IMAGE_PATH, null)
.putString(Pref.KEY_DRAWER_HEADER_IMAGE_PATH, null)
.apply();
Pref.setAppBarImagePath(null);
Pref.setDrawerHeaderImagePath(null);
Toast.makeText(getActivity(), R.string.text_restart_app_to_apply, Toast.LENGTH_SHORT).show();
}
})