Change the way of action pefrom(no longer wait for event), add loading jar file support, fix simple action memory leak

This commit is contained in:
hyb1996
2017-04-05 22:35:31 +08:00
parent b762ceb60b
commit 6844eb9841
88 changed files with 1797 additions and 832 deletions

View File

@@ -75,12 +75,12 @@
<activity android:name=".ui.console.ConsoleActivity"/>
<activity android:name=".ui.error.ErrorReportActivity"/>
<activity android:name=".ui.help.LocalWebViewActivity"/>
<activity android:name=".external.tasker.TaskerScriptEditActivity"/>
<activity
android:name=".ui.error.IssueReporterActivity"
android:theme="@style/IssueReporterTheme"/>
<service android:name=".service.VolumeChangeObverseService"/>
<service android:name="com.stardust.view.Floaty$FloatHeadService"/>
<service android:name="com.stardust.view.ResizableFloaty$FloatingWindowService"/>
<service android:name="com.stardust.scriptdroid.external.floating_window.HoverMenuService"/>

View File

@@ -0,0 +1,46 @@
package com.stardust.app;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Stardust on 2017/4/4.
*/
public class VolumeChangeObserver extends BroadcastReceiver {
public interface OnVolumeChangeListener {
void onVolumeChange();
}
public static final String ACTION_VOLUME_CHANGE = "android.media.VOLUME_CHANGED_ACTION";
private long mLastChangeMillis;
private List<OnVolumeChangeListener> mOnVolumeChangeListenerList = new ArrayList<>();
public void addOnVolumeChangeListener(OnVolumeChangeListener listener) {
mOnVolumeChangeListenerList.add(listener);
}
public void removeOnVolumeChangeListener(OnVolumeChangeListener listener) {
mOnVolumeChangeListenerList.remove(listener);
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_VOLUME_CHANGE)) {
if (System.currentTimeMillis() - mLastChangeMillis < 400) {
return;
}
mLastChangeMillis = System.currentTimeMillis();
for (OnVolumeChangeListener listener : mOnVolumeChangeListenerList) {
listener.onVolumeChange();
}
}
}
}

View File

@@ -3,12 +3,15 @@ package com.stardust.scriptdroid;
import android.app.Activity;
import android.app.Application;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.annotation.Keep;
import com.squareup.leakcanary.LeakCanary;
import com.stardust.app.SimpleActivityLifecycleCallbacks;
import com.stardust.app.VolumeChangeObserver;
import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.service.VolumeChangeObverseService;
import com.stardust.scriptdroid.service.AccessibilityWatchDogService;
import com.stardust.scriptdroid.tool.CrashHandler;
import com.stardust.scriptdroid.ui.error.ErrorReportActivity;
import com.stardust.theme.ThemeColor;
@@ -29,6 +32,8 @@ public class App extends Application {
return instance;
}
private VolumeChangeObserver mVolumeChangeObserver = new VolumeChangeObserver();
public void onCreate() {
super.onCreate();
instance = this;
@@ -50,7 +55,13 @@ public class App extends Application {
ThemeColorManager.setDefaultThemeColor(new ThemeColor(getResources().getColor(R.color.colorPrimary), getResources().getColor(R.color.colorPrimaryDark), getResources().getColor(R.color.colorAccent)));
ThemeColorManager.init(this);
AutoJs.initInstance(this);
VolumeChangeObverseService.addOnVolumeChangeListener(new VolumeChangeObverseService.OnVolumeChangeListener() {
initVolumeChangeObserver();
startService(new Intent(this, AccessibilityWatchDogService.class));
}
private void initVolumeChangeObserver() {
registerReceiver(mVolumeChangeObserver, new IntentFilter(VolumeChangeObserver.ACTION_VOLUME_CHANGE));
mVolumeChangeObserver.addOnVolumeChangeListener(new VolumeChangeObserver.OnVolumeChangeListener() {
@Override
public void onVolumeChange() {
if (Pref.isRunningVolumeControlEnabled()) {
@@ -58,7 +69,6 @@ public class App extends Application {
}
}
});
startService(new Intent(this, VolumeChangeObverseService.class));
}
private void registerActivityLifecycleCallback() {
@@ -86,6 +96,7 @@ public class App extends Application {
});
}
@Keep
public static Activity currentActivity() {
return currentActivity;
}
@@ -94,4 +105,7 @@ public class App extends Application {
return getApp().getString(id);
}
public VolumeChangeObserver getVolumeChangeObserver() {
return mVolumeChangeObserver;
}
}

View File

@@ -1,15 +1,16 @@
package com.stardust.scriptdroid.autojs;
import android.accessibilityservice.AccessibilityService;
import android.content.Context;
import android.support.annotation.Nullable;
import com.stardust.autojs.ScriptEngineService;
import com.stardust.autojs.ScriptEngineServiceBuilder;
import com.stardust.autojs.engine.NodeJsJavaScriptEngine;
import com.stardust.autojs.engine.NodeJsJavaScriptEngineManager;
import com.stardust.autojs.runtime.*;
import com.stardust.autojs.runtime.action.ActionPerformAccessibilityDelegate;
import com.stardust.autojs.runtime.api.Console;
import com.stardust.automator.AccessibilityEventCommandHost;
import com.stardust.automator.simple_action.SimpleActionPerformHost;
import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.Pref;
import com.stardust.scriptdroid.R;
@@ -40,7 +41,7 @@ public class AutoJs implements AccessibilityBridge {
}
private final AccessibilityEventCommandHost mAccessibilityEventCommandHost = new AccessibilityEventCommandHost();
private final ActionPerformAccessibilityDelegate mActionPerformAccessibilityDelegate = new ActionPerformAccessibilityDelegate();
private final SimpleActionPerformHost mSimpleActionPerformHost = new SimpleActionPerformHost();
private final AccessibilityActionRecorder mAccessibilityActionRecorder = new AccessibilityActionRecorder();
private final LayoutInspector mLayoutInspector = new LayoutInspector();
private final ScriptEngineService mScriptEngineService;
@@ -62,14 +63,24 @@ public class AutoJs implements AccessibilityBridge {
.build();
ScriptEngineService.setInstance(mScriptEngineService);
addAccessibilityServiceDelegates();
getGlobalFunctions();
}
private void getGlobalFunctions() {
new Thread(new Runnable() {
@Override
public void run() {
mScriptEngineService.getGlobalFunctions();
}
}).start();
}
private void addAccessibilityServiceDelegates() {
AccessibilityWatchDogService.addDelegateIfNeeded(100, mActionPerformAccessibilityDelegate);
AccessibilityWatchDogService.addDelegateIfNeeded(200, mAccessibilityActionRecorder);
AccessibilityWatchDogService.addDelegateIfNeeded(300, mAccessibilityEventCommandHost);
AccessibilityWatchDogService.addDelegateIfNeeded(400, mAccessibilityInfoProvider);
AccessibilityWatchDogService.addDelegateIfNeeded(500, mLayoutInspector);
AccessibilityWatchDogService.addDelegate(100, mAccessibilityInfoProvider);
// AccessibilityWatchDogService.addDelegate(200, mLayoutInspector);
AccessibilityWatchDogService.addDelegate(300, mAccessibilityActionRecorder);
// AccessibilityWatchDogService.addDelegate(400, mSimpleActionPerformHost);
//AccessibilityWatchDogService.addDelegate(500, mAccessibilityEventCommandHost);
}
public AccessibilityActionRecorder getAccessibilityActionRecorder() {
@@ -86,8 +97,14 @@ public class AutoJs implements AccessibilityBridge {
}
@Override
public ActionPerformAccessibilityDelegate getActionPerformHost() {
return mActionPerformAccessibilityDelegate;
public SimpleActionPerformHost getActionPerformHost() {
return mSimpleActionPerformHost;
}
@Nullable
@Override
public AccessibilityService getService() {
return AccessibilityWatchDogService.getInstance();
}
@Override

View File

@@ -10,10 +10,10 @@ public class CommonUtils {
public static final String EXTRA_KEY_PATH = "path";
public static final String EXTRA_KEY_PREPARE_SCRIPT = "script";
public static final String EXTRA_KEY_PRE_EXECUTE_SCRIPT = "script";
public static boolean isTaskerBundleValid(Bundle bundle) {
return bundle.containsKey(CommonUtils.EXTRA_KEY_PATH);
return bundle.containsKey(CommonUtils.EXTRA_KEY_PATH) || bundle.containsKey(EXTRA_KEY_PRE_EXECUTE_SCRIPT);
}
}

View File

@@ -68,7 +68,7 @@ public class HoverMenuService extends Service {
private static void setIsRunning(boolean isRunning) {
sIsRunning = isRunning;
EventBus.getDefault().post(new ServiceStateChangedEvent(sIsRunning));
eventBus.post(new ServiceStateChangedEvent(sIsRunning));
}
public static void postEvent(MessageEvent event) {
@@ -96,7 +96,7 @@ public class HoverMenuService extends Service {
private HoverMenu.OnExitListener mWindowHoverMenuMenuExitListener = new HoverMenu.OnExitListener() {
@Override
public void onExitByUserRequest() {
EventBus.getDefault().post(new MessageEvent(MESSAGE_MENU_EXIT));
eventBus.post(new MessageEvent(MESSAGE_MENU_EXIT));
savePreferredLocation();
mWindowHoverMenu.hide();
stopSelf();
@@ -106,7 +106,7 @@ public class HoverMenuService extends Service {
@Override
public void onCreate() {
super.onCreate();
EventBus.getDefault().register(this);
eventBus.register(this);
mPrefs = getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE);
tryInitViews();
}
@@ -141,14 +141,14 @@ public class HoverMenuService extends Service {
mWindowHoverMenu.setHoverMenuTransitionListener(new SimpleHoverMenuTransitionListener() {
@Override
public void onExpanding() {
EventBus.getDefault().post(new MessageEvent(MESSAGE_MENU_EXPANDING));
eventBus.post(new MessageEvent(MESSAGE_MENU_EXPANDING));
captureCurrentWindow();
}
@Override
public void onCollapsing() {
AutoJs.getInstance().getLayoutInspector().clearCapture();
EventBus.getDefault().post(new MessageEvent(MESSAGE_MENU_COLLAPSING));
eventBus.post(new MessageEvent(MESSAGE_MENU_COLLAPSING));
}
});
}
@@ -182,8 +182,8 @@ public class HoverMenuService extends Service {
public void onDestroy() {
if (mWindowHoverMenu != null)
mWindowHoverMenu.hide();
if (EventBus.getDefault().isRegistered(this))
EventBus.getDefault().unregister(this);
if (eventBus.isRegistered(this))
eventBus.unregister(this);
setIsRunning(false);
}

View File

@@ -1,7 +1,6 @@
package com.stardust.scriptdroid.external.floating_window.content;
import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.widget.SwitchCompat;
import android.view.View;
@@ -9,6 +8,7 @@ import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.stardust.app.VolumeChangeObserver;
import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.Pref;
import com.stardust.scriptdroid.R;
@@ -19,7 +19,6 @@ import com.stardust.scriptdroid.record.Recorder;
import com.stardust.scriptdroid.record.accessibility.AccessibilityActionRecorder;
import com.stardust.scriptdroid.record.inputevent.InputEventConverter;
import com.stardust.scriptdroid.record.inputevent.TouchRecorder;
import com.stardust.scriptdroid.service.VolumeChangeObverseService;
import com.stardust.scriptdroid.ui.main.MainActivity;
import com.stardust.util.MessageEvent;
import com.stardust.view.ViewBinder;
@@ -58,7 +57,7 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat
private Recorder mRecorder;
private Context mContext;
private VolumeChangeObverseService.OnVolumeChangeListener mOnVolumeChangeListener = new VolumeChangeObverseService.OnVolumeChangeListener() {
private VolumeChangeObserver.OnVolumeChangeListener mOnVolumeChangeListener = new VolumeChangeObserver.OnVolumeChangeListener() {
@Override
public void onVolumeChange() {
if (Pref.isRecordVolumeControlEnable()) {
@@ -76,8 +75,7 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat
mView = View.inflate(context, R.layout.floating_window_record, null);
ViewBinder.bind(this);
EventBus.getDefault().register(this);
App.getApp().startService(new Intent(App.getApp(), VolumeChangeObverseService.class));
VolumeChangeObverseService.addOnVolumeChangeListener(mOnVolumeChangeListener);
App.getApp().getVolumeChangeObserver().addOnVolumeChangeListener(mOnVolumeChangeListener);
}
@NonNull
@@ -163,7 +161,7 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat
pauseRecord();
} else if (event.message.equals(HoverMenuService.MESSAGE_MENU_EXIT)) {
EventBus.getDefault().unregister(this);
VolumeChangeObverseService.removeOnVolumeChangeListener(mOnVolumeChangeListener);
App.getApp().getVolumeChangeObserver().removeOnVolumeChangeListener(mOnVolumeChangeListener);
}
}

View File

@@ -12,7 +12,6 @@ import com.stardust.autojs.script.FileScriptSource;
import com.stardust.autojs.script.MultiScriptSource;
import com.stardust.autojs.script.ScriptSource;
import com.stardust.autojs.script.StringScriptSource;
import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.external.CommonUtils;
import com.stardust.scriptdroid.R;
@@ -36,7 +35,7 @@ public class RunIntentActivity extends Activity {
private void handleIntent(Intent intent) {
String path = getPath(intent);
String script = intent.getStringExtra(CommonUtils.EXTRA_KEY_PREPARE_SCRIPT);
String script = intent.getStringExtra(CommonUtils.EXTRA_KEY_PRE_EXECUTE_SCRIPT);
ScriptSource source = null;
if (path == null && script != null) {
source = new StringScriptSource(script);

View File

@@ -1,16 +1,13 @@
package com.stardust.scriptdroid.external.tasker;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.util.Log;
import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.external.CommonUtils;
import com.stardust.scriptdroid.external.open.RunIntentActivity;
import com.stardust.scriptdroid.external.shortcut.ShortcutActivity;
import com.twofortyfouram.locale.sdk.client.receiver.AbstractPluginSettingReceiver;
/**
@@ -36,6 +33,6 @@ public class FireSettingReceiver extends AbstractPluginSettingReceiver {
context.startActivity(new Intent(App.getApp(), RunIntentActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.putExtra(CommonUtils.EXTRA_KEY_PATH, bundle.getString(CommonUtils.EXTRA_KEY_PATH))
.putExtra(CommonUtils.EXTRA_KEY_PREPARE_SCRIPT, bundle.getString(CommonUtils.EXTRA_KEY_PREPARE_SCRIPT)));
.putExtra(CommonUtils.EXTRA_KEY_PRE_EXECUTE_SCRIPT, bundle.getString(CommonUtils.EXTRA_KEY_PRE_EXECUTE_SCRIPT)));
}
}

View File

@@ -1,37 +1,50 @@
package com.stardust.scriptdroid.external.tasker;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import com.stardust.scriptdroid.scripts.ScriptFile;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.external.CommonUtils;
import com.stardust.scriptdroid.scripts.ScriptFile;
import com.stardust.scriptdroid.scripts.StorageScriptProvider;
import com.stardust.scriptdroid.ui.BaseActivity;
import com.stardust.scriptdroid.ui.main.script_list.ScriptAndFolderListRecyclerView;
import com.stardust.scriptdroid.ui.main.script_list.ScriptListWithProgressBarView;
import com.twofortyfouram.locale.sdk.client.ui.activity.AbstractPluginActivity;
import com.stardust.view.ViewBinder;
import com.stardust.view.ViewBinding;
import com.twofortyfouram.locale.sdk.client.ui.activity.AbstractAppCompatPluginActivity;
/**
* Created by Stardust on 2017/3/27.
*/
public class TaskPrefEditActivity extends AbstractPluginActivity {
public class TaskPrefEditActivity extends AbstractAppCompatPluginActivity {
private String mSelectedScriptFilePath;
private String mPreExecuteScript;
private StorageScriptProvider mStorageScriptProvider;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tasker_edit);
BaseActivity.setToolbarAsBack(this, R.id.toolbar, getString(R.string.text_please_choose_a_script));
initScriptListRecyclerView();
ViewBinder.bind(this);
}
private void initScriptListRecyclerView() {
ScriptListWithProgressBarView scriptListWithProgressBarView = (ScriptListWithProgressBarView) findViewById(R.id.script_list);
scriptListWithProgressBarView.setScriptFileOperationEnabled(false);
scriptListWithProgressBarView.setOnItemClickListener(new ScriptAndFolderListRecyclerView.OnScriptFileClickListener() {
mStorageScriptProvider = StorageScriptProvider.getExternalStorageProvider();
ScriptListWithProgressBarView scriptList = (ScriptListWithProgressBarView) findViewById(R.id.script_list);
scriptList.setScriptFileOperationEnabled(false);
scriptList.setStorageScriptProvider(mStorageScriptProvider);
scriptList.setCurrentDirectory(StorageScriptProvider.DEFAULT_DIRECTORY);
scriptList.setOnItemClickListener(new ScriptAndFolderListRecyclerView.OnScriptFileClickListener() {
@Override
public void onClick(ScriptFile file) {
mSelectedScriptFilePath = file.getPath();
@@ -41,6 +54,31 @@ public class TaskPrefEditActivity extends AbstractPluginActivity {
}
@ViewBinding.Click(R.id.edit_script)
private void editPreExecuteScript() {
TaskerScriptEditActivity.edit(this, getString(R.string.text_pre_execute_script), getString(R.string.summary_pre_execute_script), mPreExecuteScript == null ? "" : mPreExecuteScript);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == R.id.action_refresh) {
mStorageScriptProvider.refreshAll();
} else if (item.getItemId() == R.id.action_clear_file_selection) {
mSelectedScriptFilePath = null;
} else {
mPreExecuteScript = null;
}
return true;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.tasker_script_edit_menu, menu);
return true;
}
@Override
public boolean isBundleValid(@NonNull Bundle bundle) {
return CommonUtils.isTaskerBundleValid(bundle);
@@ -49,6 +87,7 @@ public class TaskPrefEditActivity extends AbstractPluginActivity {
@Override
public void onPostCreateWithPreviousResult(@NonNull Bundle bundle, @NonNull String s) {
mSelectedScriptFilePath = bundle.getString(CommonUtils.EXTRA_KEY_PATH);
mPreExecuteScript = bundle.getString(CommonUtils.EXTRA_KEY_PRE_EXECUTE_SCRIPT);
}
@Nullable
@@ -56,12 +95,27 @@ public class TaskPrefEditActivity extends AbstractPluginActivity {
public Bundle getResultBundle() {
Bundle bundle = new Bundle();
bundle.putString(CommonUtils.EXTRA_KEY_PATH, mSelectedScriptFilePath);
bundle.putString(CommonUtils.EXTRA_KEY_PRE_EXECUTE_SCRIPT, mPreExecuteScript);
return bundle;
}
@NonNull
@Override
public String getResultBlurb(@NonNull Bundle bundle) {
return bundle.getString(CommonUtils.EXTRA_KEY_PATH, getString(R.string.text_path_is_empty));
String blurb = bundle.getString(CommonUtils.EXTRA_KEY_PATH);
if (TextUtils.isEmpty(blurb)) {
blurb = bundle.getString(CommonUtils.EXTRA_KEY_PRE_EXECUTE_SCRIPT);
}
if (TextUtils.isEmpty(blurb)) {
blurb = getString(R.string.text_path_is_empty);
}
return blurb;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
mPreExecuteScript = data.getStringExtra(TaskerScriptEditActivity.EXTRA_CONTENT);
}
}
}

View File

@@ -0,0 +1,107 @@
package com.stardust.scriptdroid.external.tasker;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.widget.TextView;
import com.jecelyin.editor.v2.common.Command;
import com.jecelyin.editor.v2.ui.EditorDelegate;
import com.jecelyin.editor.v2.view.EditorView;
import com.jecelyin.editor.v2.view.menu.MenuDef;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.ui.BaseActivity;
import com.stardust.scriptdroid.ui.edit.EditActivity;
import com.stardust.scriptdroid.ui.edit.completion.InputMethodEnhanceBar;
import com.stardust.scriptdroid.ui.edit.editor920.Editor920Activity;
import com.stardust.scriptdroid.ui.edit.editor920.Editor920Utils;
import com.stardust.view.ViewBinder;
import com.stardust.view.ViewBinding;
import com.stardust.widget.ToolbarMenuItem;
/**
* Created by Stardust on 2017/4/5.
*/
public class TaskerScriptEditActivity extends Editor920Activity {
public static final int REQUEST_CODE = "Love you. Can we go back?".hashCode() >> 16;
public static final String EXTRA_CONTENT = "Still Love Eating 17.4.5";
public static void edit(Activity activity, String title, String summary, String content) {
activity.startActivityForResult(new Intent(activity, TaskerScriptEditActivity.class)
.putExtra(EXTRA_CONTENT, content)
.putExtra("summary", summary)
.putExtra("title", title), REQUEST_CODE);
}
private EditorDelegate mEditorDelegate;
private String mTitle, mSummary;
private ToolbarMenuItem mRedo, mUndo;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
handleIntent(getIntent());
setUpUI();
BaseActivity.setToolbarAsBack(this, R.id.toolbar, mTitle);
setUpEditor();
ViewBinder.bind(this);
}
private void setUpUI() {
setTheme(R.style.EditorTheme);
setContentView(R.layout.activity_tasker_script_edit);
((TextView) findViewById(R.id.summary)).setText(mSummary);
mRedo = (ToolbarMenuItem) findViewById(R.id.redo);
mUndo = (ToolbarMenuItem) findViewById(R.id.undo);
}
private void handleIntent(Intent intent) {
mTitle = intent.getStringExtra("title");
mSummary = intent.getStringExtra("summary");
String content = intent.getStringExtra(EXTRA_CONTENT);
mEditorDelegate = new EditorDelegate(0, mTitle, content);
}
private void setUpEditor() {
final EditorView editorView = (EditorView) findViewById(R.id.editor);
mEditorDelegate.setEditorView(editorView);
Editor920Utils.setLang(mEditorDelegate, "JavaScript");
editorView.getEditText().setHorizontallyScrolling(true);
setUpInputMethodEnhanceBar(editorView);
}
private void setUpInputMethodEnhanceBar(final EditorView editorView) {
InputMethodEnhanceBar inputMethodEnhanceBar = (InputMethodEnhanceBar) findViewById(R.id.input_method_enhance_bar);
inputMethodEnhanceBar.setEditTextBridge(new EditActivity.InputMethodEnhanceBarBridge(this, editorView.getEditText()));
}
@ViewBinding.Click(R.id.undo)
private void undo() {
Command command = new Command(Command.CommandEnum.UNDO);
mEditorDelegate.doCommand(command);
}
@ViewBinding.Click(R.id.redo)
private void redo() {
Command command = new Command(Command.CommandEnum.REDO);
mEditorDelegate.doCommand(command);
}
@Override
public void finish() {
setResult(RESULT_OK, new Intent().putExtra(EXTRA_CONTENT, mEditorDelegate.getText()));
super.finish();
}
public void setMenuStatus(int menuResId, int status) {
boolean disabled = status == MenuDef.STATUS_DISABLED;
if (menuResId == com.jecelyin.editor.v2.R.id.m_redo) {
mRedo.setEnabled(!disabled);
} else if (menuResId == com.jecelyin.editor.v2.R.id.m_undo) {
mUndo.setEnabled(!disabled);
}
}
}

View File

@@ -4,6 +4,7 @@ import android.accessibilityservice.AccessibilityService;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.scriptdroid.service.AccessibilityWatchDogService;
import com.stardust.view.accessibility.AccessibilityDelegate;
/**
@@ -12,31 +13,30 @@ import com.stardust.view.accessibility.AccessibilityDelegate;
public class LayoutInspector implements AccessibilityDelegate {
private AccessibilityNodeInfo mRootInActiveWindow;
private NodeInfo mCapture;
@Override
public boolean onAccessibilityEvent(AccessibilityService service, AccessibilityEvent event) {
mRootInActiveWindow = service.getRootInActiveWindow();
return false;
}
public AccessibilityNodeInfo getRootInActiveWindow() {
return mRootInActiveWindow;
}
public NodeInfo captureCurrentWindow() {
if (mRootInActiveWindow == null) {
AccessibilityService service = AccessibilityWatchDogService.getInstance();
if (service == null) {
mCapture = null;
} else {
mCapture = NodeInfo.capture(mRootInActiveWindow);
AccessibilityNodeInfo root = service.getRootInActiveWindow();
if (root == null) {
mCapture = null;
} else {
mCapture = NodeInfo.capture(root);
}
}
return mCapture;
}
public void clearCapture() {
mRootInActiveWindow = null;
mCapture = null;
}

View File

@@ -1,17 +1,20 @@
package com.stardust.scriptdroid.layout_inspector;
import android.graphics.Rect;
import android.support.annotation.Keep;
import android.support.annotation.NonNull;
import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.view.accessibility.AccessibilityNodeInfoAllocator;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Stardust on 2017/3/10.
*/
@Keep
public class NodeInfo {
private List<NodeInfo> children = new ArrayList<>();
@@ -74,7 +77,7 @@ public class NodeInfo {
public static NodeInfo capture(@NonNull AccessibilityNodeInfo root) {
NodeInfo nodeInfo = new NodeInfo(root);
for (int i = 0; i < root.getChildCount(); i++) {
AccessibilityNodeInfo child = root.getChild(i);
AccessibilityNodeInfo child = AccessibilityNodeInfoAllocator.getGlobal().getChild(root, i);
if (child != null) {
nodeInfo.children.add(capture(child));
}

View File

@@ -6,7 +6,7 @@ import android.util.SparseArray;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.autojs.runtime.action.FilterAction;
import com.stardust.automator.simple_action.FilterAction;
import com.stardust.scriptdroid.layout_inspector.NodeInfo;
import com.stardust.util.SparseArrayEntries;
import com.stardust.view.accessibility.AccessibilityNodeInfoHelper;

View File

@@ -2,6 +2,7 @@ package com.stardust.scriptdroid.record.accessibility;
import android.accessibilityservice.AccessibilityService;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.scriptdroid.record.Recorder;
import com.stardust.view.accessibility.AccessibilityDelegate;

View File

@@ -3,6 +3,7 @@ package com.stardust.scriptdroid.scripts;
import android.os.Environment;
import com.stardust.pio.PFile;
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
@@ -56,7 +57,7 @@ public class ScriptFile extends File {
return listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isDirectory() || (file.getName().endsWith(".js") && !file.getName().startsWith("."));
return (file.isDirectory() || file.getName().endsWith(".js")) && !file.getName().startsWith(".");
}
});
}

View File

@@ -14,6 +14,8 @@ import java.lang.ref.WeakReference;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
/**
* Created by Stardust on 2017/2/14.
@@ -25,45 +27,10 @@ public class AccessibilityWatchDogService extends AccessibilityService {
private static final SortedMap<Integer, AccessibilityDelegate> mDelegates = new TreeMap<>();
private static WeakReference<AccessibilityWatchDogService> instance;
private Executor mExecutor = Executors.newSingleThreadExecutor();
public static void addDelegate(AccessibilityDelegate delegate, int uniquePriority) {
synchronized (mDelegates) {
mDelegates.put(uniquePriority, delegate);
}
}
public static boolean containsPriority(int priority) {
synchronized (mDelegates) {
return mDelegates.containsKey(priority);
}
}
public static AccessibilityDelegate getDelegate(int priority) {
synchronized (mDelegates) {
return mDelegates.get(priority);
}
}
public static void addDelegateIfNeeded(int priority, Class<? extends AccessibilityDelegate> delegateClass) {
try {
addDelegateIfNeeded(priority, delegateClass.newInstance());
} catch (InstantiationException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
public static void addDelegateIfNeeded(int priority, AccessibilityDelegate delegate) {
synchronized (mDelegates) {
if (!mDelegates.containsKey(priority)) {
mDelegates.put(priority, delegate);
}
}
}
public static boolean removeDelegate(int priority) {
synchronized (mDelegates) {
return mDelegates.remove(priority) != null;
}
public static void addDelegate(int uniquePriority, AccessibilityDelegate delegate) {
mDelegates.put(uniquePriority, delegate);
}
public static boolean isEnable() {
@@ -77,15 +44,18 @@ public class AccessibilityWatchDogService extends AccessibilityService {
}
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
public void onAccessibilityEvent(final AccessibilityEvent event) {
Log.v(TAG, "onAccessibilityEvent: " + event);
synchronized (mDelegates) {
for (Map.Entry<Integer, AccessibilityDelegate> entry : mDelegates.entrySet()) {
//Log.v(TAG, "delegate: " + entry.getValue().getClass().getName());
if (entry.getValue().onAccessibilityEvent(this, event))
break;
mExecutor.execute(new Runnable() {
@Override
public void run() {
for (Map.Entry<Integer, AccessibilityDelegate> entry : mDelegates.entrySet()) {
Log.v(TAG, "delegate: " + entry.getValue().getClass().getName());
if (entry.getValue().onAccessibilityEvent(AccessibilityWatchDogService.this, event))
break;
}
}
}
});
}
@Override

View File

@@ -1,82 +0,0 @@
package com.stardust.scriptdroid.service;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.support.v7.widget.SwitchCompat;
import com.stardust.scriptdroid.record.Recorder;
import com.stardust.scriptdroid.record.accessibility.AccessibilityActionRecorder;
import com.stardust.scriptdroid.Pref;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
/**
* Created by Stardust on 2017/2/16.
*/
public class VolumeChangeObverseService extends Service {
public interface OnVolumeChangeListener {
void onVolumeChange();
}
private static final String ACTION_VOLUME_CHANGE = "android.media.VOLUME_CHANGED_ACTION";
private static List<OnVolumeChangeListener> mOnVolumeChangeListenerList = new ArrayList<>();
public static void addOnVolumeChangeListener(OnVolumeChangeListener listener) {
mOnVolumeChangeListenerList.add(listener);
}
public static void removeOnVolumeChangeListener(OnVolumeChangeListener listener) {
mOnVolumeChangeListenerList.remove(listener);
}
private VolumeChangeReceiver mVolumeChangeReceiver;
@Override
public void onCreate() {
super.onCreate();
mVolumeChangeReceiver = new VolumeChangeReceiver();
registerReceiver(mVolumeChangeReceiver, new IntentFilter(ACTION_VOLUME_CHANGE));
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mVolumeChangeReceiver);
}
private class VolumeChangeReceiver extends BroadcastReceiver {
private long mLastChangeMillis;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_VOLUME_CHANGE)) {
if (System.currentTimeMillis() - mLastChangeMillis < 400) {
return;
}
mLastChangeMillis = System.currentTimeMillis();
for (OnVolumeChangeListener listener : mOnVolumeChangeListenerList) {
listener.onVolumeChange();
}
}
}
}
}

View File

@@ -1,5 +1,6 @@
package com.stardust.scriptdroid.ui;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.Nullable;
@@ -10,6 +11,7 @@ import android.view.View;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.external.tasker.TaskPrefEditActivity;
import com.stardust.theme.ThemeColorManager;
import com.stardust.util.BackPressedHandler;
@@ -71,18 +73,7 @@ public abstract class BaseActivity extends AppCompatActivity {
}
public void setToolbarAsBack(String title) {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle(title);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null) {
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
setToolbarAsBack(this, R.id.toolbar, title);
}
public void registerBackPressedHandler(BackPressedHandler handler) {
@@ -95,4 +86,19 @@ public abstract class BaseActivity extends AppCompatActivity {
super.onBackPressed();
}
}
public static void setToolbarAsBack(final AppCompatActivity activity, int id, String title) {
Toolbar toolbar = (Toolbar) activity.findViewById(id);
toolbar.setTitle(title);
activity.setSupportActionBar(toolbar);
if (activity.getSupportActionBar() != null) {
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
activity.finish();
}
});
activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
}
}

View File

@@ -1,5 +1,6 @@
package com.stardust.scriptdroid.ui.edit;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -9,9 +10,9 @@ import android.support.annotation.NonNull;
import android.support.design.widget.Snackbar;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.widget.Toolbar;
import android.util.SparseArray;
import android.view.View;
import android.view.inputmethod.InputMethod;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
@@ -19,11 +20,14 @@ import com.stardust.autojs.engine.JavaScriptEngine;
import com.stardust.autojs.ScriptExecutionListener;
import com.stardust.autojs.script.FileScriptSource;
import com.stardust.autojs.script.ScriptSource;
import com.stardust.autojs.script.StringScriptSource;
import com.stardust.pio.PFile;
import com.stardust.scriptdroid.Pref;
import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.scripts.ScriptFile;
import com.stardust.scriptdroid.ui.BaseActivity;
import com.stardust.scriptdroid.ui.edit.editor920.Editor920Activity;
import com.stardust.scriptdroid.ui.edit.editor920.Editor920Utils;
import com.stardust.scriptdroid.ui.edit.sidemenu.EditSideMenuFragment;
import com.stardust.scriptdroid.ui.edit.sidemenu.FunctionListRecyclerView;
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
@@ -52,11 +56,40 @@ import timber.log.Timber;
public class EditActivity extends Editor920Activity {
public static class InputMethodEnhanceBarBridge implements InputMethodEnhanceBar.EditTextBridge {
private Editor920Activity mEditor920Activity;
private TextView mTextView;
public InputMethodEnhanceBarBridge(Editor920Activity editor920Activity, TextView textView) {
mEditor920Activity = editor920Activity;
mTextView = textView;
}
@Override
public void appendText(CharSequence text) {
mEditor920Activity.insertText(text);
}
@Override
public void backspace(int count) {
}
@Override
public TextView getEditText() {
return mTextView;
}
}
public static final String EXTRA_CONTENT = "Still Love Eating 17.4.5";
private static final String KEY_EDIT_ACTIVITY_FIRST_USE = "KEY_EDIT_ACTIVITY_FIRST_USE";
private static final String ACTION_ON_RUN_FINISHED = "ACTION_ON_RUN_FINISHED";
private static final String EXTRA_EXCEPTION_MESSAGE = "EXTRA_EXCEPTION_MESSAGE";
private static final ScriptExecutionListener SCRIPT_EXECUTION_LISTENER = new ScriptExecutionListener() {
@Override
@@ -82,12 +115,11 @@ public class EditActivity extends Editor920Activity {
editFile(context, null, path);
}
public static void editAssetFile(Context context, String name, String path) {
public static void view(Context context, String name, String content) {
context.startActivity(new Intent(context, EditActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.putExtra("fromAssets", true)
.putExtra("path", path)
.putExtra("readOnly", true)
.putExtra("content", content)
.putExtra("name", name));
}
@@ -125,7 +157,10 @@ public class EditActivity extends Editor920Activity {
public void onCreate(Bundle b) {
super.onCreate(b);
handleIntent();
setTheme(R.style.EditorTheme);
mView = View.inflate(this, R.layout.activity_edit, null);
setContentView(mView);
handleIntent(getIntent());
setUpUI();
setUpEditor();
registerReceiver(mOnRunFinishedReceiver, new IntentFilter(ACTION_ON_RUN_FINISHED));
@@ -149,32 +184,29 @@ public class EditActivity extends Editor920Activity {
}
}
private void handleIntent() {
String path = getIntent().getStringExtra("path");
mName = getIntent().getStringExtra("name");
if (path == null) {
finish();
private void handleIntent(Intent intent) {
String path = intent.getStringExtra("path");
mName = intent.getStringExtra("name");
mReadOnly = intent.getBooleanExtra("readOnly", false);
boolean saveEnabled = intent.getBooleanExtra("saveEnabled", true);
if (mReadOnly || !saveEnabled) {
findViewById(R.id.save).setVisibility(View.GONE);
}
String content = intent.getStringExtra("content");
if (content != null) {
mEditorDelegate = new EditorDelegate(0, mName, content);
} else {
if (getIntent().getBooleanExtra("fromAssets", false)) {
mReadOnly = true;
//TODO 优化
mFile = PFile.copyAssetToTmpFile(this, path);
} else {
mFile = new File(path);
}
mFile = new File(path);
if (mName == null) {
mName = mFile.getName();
}
mEditorDelegate = new EditorDelegate(0, mFile, 0, "utf-8");
}
}
private void setUpUI() {
setTheme(R.style.EditorTheme);
ThemeColorManager.addActivityStatusBar(this);
mView = View.inflate(this, R.layout.activity_edit, null);
mDrawerLayout = (DrawerLayout) mView.findViewById(R.id.drawer_layout);
setContentView(mView);
initSideMenuFragment();
setUpToolbar();
initMenuItem();
@@ -194,57 +226,33 @@ public class EditActivity extends Editor920Activity {
}
private void setUpEditor() {
if (mFile != null) {
mEditorDelegate = new EditorDelegate(0, mFile, 0, null);
final EditorView editorView = (EditorView) findViewById(R.id.editor);
mEditorDelegate.setEditorView(editorView);
editorView.getEditText().setReadOnly(mReadOnly);
editorView.getEditText().setHorizontallyScrolling(true);
InputMethodEnhanceBar inputMethodEnhanceBar = (InputMethodEnhanceBar) findViewById(R.id.input_method_enhance_bar);
if (mReadOnly) {
inputMethodEnhanceBar.setVisibility(View.GONE);
} else {
inputMethodEnhanceBar.setEditTextBridge(new InputMethodEnhanceBar.EditTextBridge() {
@Override
public void appendText(CharSequence text) {
insertText(text);
}
final EditorView editorView = (EditorView) findViewById(R.id.editor);
mEditorDelegate.setEditorView(editorView);
if (mFile == null)
Editor920Utils.setLang(mEditorDelegate, "JavaScript");
editorView.getEditText().setReadOnly(mReadOnly);
editorView.getEditText().setHorizontallyScrolling(true);
setUpInputMethodEnhanceBar(editorView);
@Override
public void backspace(int count) {
}
}
@Override
public TextView getEditText() {
return editorView.getEditText();
}
});
}
private void setUpInputMethodEnhanceBar(final EditorView editorView) {
InputMethodEnhanceBar inputMethodEnhanceBar = (InputMethodEnhanceBar) findViewById(R.id.input_method_enhance_bar);
if (mReadOnly) {
inputMethodEnhanceBar.setVisibility(View.GONE);
} else {
inputMethodEnhanceBar.setEditTextBridge(new InputMethodEnhanceBarBridge(this, editorView.getEditText()));
}
}
private void setUpToolbar() {
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle(mName);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null) {
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
BaseActivity.setToolbarAsBack(this, R.id.toolbar, mName);
}
@ViewBinding.Click(R.id.run)
private void runAndSaveFileIFNeeded() {
if (mEditorDelegate.isChanged()) {
if (!mReadOnly && mEditorDelegate.isChanged()) {
saveFile(false, new SaveListener() {
@Override
public void onSaved() {
@@ -267,7 +275,11 @@ public class EditActivity extends Editor920Activity {
private void run() {
Snackbar.make(mView, R.string.text_start_running, Snackbar.LENGTH_SHORT).show();
setMenuStatus(R.id.run, MenuDef.STATUS_DISABLED);
AutoJs.getInstance().getScriptEngineService().execute(new FileScriptSource(mName, mFile), SCRIPT_EXECUTION_LISTENER);
if (mFile != null) {
AutoJs.getInstance().getScriptEngineService().execute(new FileScriptSource(mName, mFile), SCRIPT_EXECUTION_LISTENER);
} else {
AutoJs.getInstance().getScriptEngineService().execute(new StringScriptSource(mName, mEditorDelegate.getText()), SCRIPT_EXECUTION_LISTENER);
}
}
@ViewBinding.Click(R.id.undo)
@@ -314,6 +326,7 @@ public class EditActivity extends Editor920Activity {
}
}
private void showExitConfirmDialog() {
new ThemeColorMaterialDialogBuilder(this)
.title(R.string.text_alert)

View File

@@ -0,0 +1,27 @@
package com.stardust.scriptdroid.ui.edit.editor920;
import com.jecelyin.editor.v2.ui.Document;
import com.jecelyin.editor.v2.ui.EditorDelegate;
import java.lang.reflect.Field;
/**
* Created by Stardust on 2017/4/5.
*/
public class Editor920Utils {
public static Document getDocument(EditorDelegate editorDelegate) {
try {
Field field = EditorDelegate.class.getDeclaredField("document");
field.setAccessible(true);
return (Document) field.get(editorDelegate);
} catch (NoSuchFieldException | IllegalAccessException e) {
throw new RuntimeException(e);
}
}
public static void setLang(EditorDelegate editorDelegate, String name) {
getDocument(editorDelegate).setMode(name);
}
}

View File

@@ -15,13 +15,13 @@ public class IssueReporterActivity extends AbstractIssueReporterActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//绕过GitHub安全检查
String token = decode("MzA5MWJhNWI0NDM2NWYzOGRmNDA4ZWRhM2Y5MTUxN2ZlNDVlZDBhZQ==");
String token = decode("ZGRjYWM4NTI5ZmJjZjFkMjk3NTU1NWYyODEwNmQzYjJhYWU0MjFmMA==");
setGuestToken(token);
}
@Override
protected GithubTarget getTarget() {
return new GithubTarget("hyb1996", "NoRootScriptDroid");
return new GithubTarget("hyb1996-guest", "AutoJsIssueReport");
}

View File

@@ -43,7 +43,7 @@ public abstract class ScriptFileOperation {
public static void createShortcut(ScriptFile scriptFile) {
new Shortcut(App.getApp()).name(scriptFile.getSimplifiedName())
.targetClass(ShortcutActivity.class)
.icon(R.drawable.ic_robot_green)
.icon(R.drawable.ic_node_js_black)
.extras(new Intent().putExtra(CommonUtils.EXTRA_KEY_PATH, scriptFile.getPath()))
.send();
}

View File

@@ -9,11 +9,13 @@ import android.view.ViewGroup;
import com.afollestad.materialdialogs.MaterialDialog;
import com.stardust.app.Fragment;
import com.stardust.pio.PFile;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.scripts.sample.Sample;
import com.stardust.scriptdroid.scripts.sample.SampleFileManager;
import com.stardust.scriptdroid.ui.edit.EditActivity;
import com.stardust.scriptdroid.ui.main.MainActivity;
import com.stardust.util.AssetsCache;
import java.io.IOException;
@@ -75,7 +77,7 @@ public class SampleScriptListFragment extends Fragment {
}
private void viewSample(Sample sample) {
EditActivity.editAssetFile(getContext(), sample.name, sample.path);
EditActivity.view(getContext(), sample.name, AssetsCache.get(getActivity(), sample.path));
}
}

View File

@@ -110,8 +110,8 @@ public class ScriptAndFolderListRecyclerView extends RecyclerView {
init();
}
private void setCurrentDirectory(final ScriptFile folder, boolean canGoBack) {
mCurrentDirectory = folder;
private void setCurrentDirectory(final ScriptFile directory, boolean canGoBack) {
mCurrentDirectory = directory;
mCanGoBack = canGoBack;
if (mFileProcessListener != null) {
mFileProcessListener.onFilesListing();
@@ -119,7 +119,7 @@ public class ScriptAndFolderListRecyclerView extends RecyclerView {
new Thread(new Runnable() {
@Override
public void run() {
mScriptFileList = mStorageScriptProvider.getDirectoryScriptFiles(folder);
mScriptFileList = mStorageScriptProvider.getDirectoryScriptFiles(directory);
post(new Runnable() {
@Override
public void run() {
@@ -131,6 +131,10 @@ public class ScriptAndFolderListRecyclerView extends RecyclerView {
}).start();
}
public void setCurrentDirectory(final ScriptFile directory) {
setCurrentDirectory(directory, !directory.equals(mRootDirectory));
}
private void setRootDirectory(ScriptFile folder) {
mRootDirectory = folder;
setCurrentDirectory(mRootDirectory, false);
@@ -195,7 +199,7 @@ public class ScriptAndFolderListRecyclerView extends RecyclerView {
Bundle bundle = (Bundle) state;
mRootDirectory = (ScriptFile) bundle.getSerializable("root");
mCurrentDirectory = (ScriptFile) bundle.getSerializable("current");
setCurrentDirectory(mCurrentDirectory, !mCurrentDirectory.equals(mRootDirectory));
setCurrentDirectory(mCurrentDirectory);
super.onRestoreInstanceState(bundle.getParcelable("superData"));
}

View File

@@ -12,6 +12,7 @@ import android.view.View;
import android.widget.FrameLayout;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.scripts.ScriptFile;
import com.stardust.scriptdroid.scripts.StorageScriptProvider;
/**
@@ -89,4 +90,7 @@ public class ScriptListWithProgressBarView extends FrameLayout {
}
public void setCurrentDirectory(ScriptFile directory) {
mScriptAndFolderListRecyclerView.setCurrentDirectory(directory);
}
}

View File

@@ -19,6 +19,7 @@ import com.stardust.autojs.script.ScriptSource;
import com.stardust.scriptdroid.R;
import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
@@ -44,7 +45,7 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView implements Java
}
};
private final List<JavaScriptEngine> mScriptEngines = new LinkedList<>();
private final List<JavaScriptEngine> mScriptEngines = new ArrayList<>();
private Adapter mAdapter;
public TaskListRecyclerView(Context context) {

View File

@@ -45,9 +45,14 @@ public class TaskManagerFragment extends Fragment {
@Override
public void onSomethingChanged() {
boolean noRunningScript = mTaskListRecyclerView.getAdapter().getItemCount() == 0;
final boolean noRunningScript = mTaskListRecyclerView.getAdapter().getItemCount() == 0;
mNoRunningScriptNotice.setVisibility(noRunningScript ? View.VISIBLE : View.GONE);
mCloseAllView.setVisibility(noRunningScript ? View.GONE : View.VISIBLE);
mCloseAllView.postDelayed(new Runnable() {
@Override
public void run() {
mCloseAllView.setVisibility(noRunningScript ? View.GONE : View.VISIBLE);
}
}, 150);
}
});

View File

@@ -118,10 +118,5 @@ public class AboutActivity extends BaseActivity {
Toast.makeText(this, R.string.text_it_is_the_developer_of_app, 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();
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 509 B

View File

@@ -1,9 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:clipToPadding="false"
android:theme="@style/AppTheme.AppBarOverlay">
<com.stardust.theme.widget.ThemeColorToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/AppTheme.PopupOverlay"
app:title="@string/_app_name">
</com.stardust.theme.widget.ThemeColorToolbar>
</android.support.design.widget.AppBarLayout>
<LinearLayout
android:id="@+id/edit_script"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#e4e4e4"
android:foreground="?selectableItemBackground">
<ImageView
android:layout_width="22dp"
android:layout_height="22dp"
android:layout_marginBottom="12dp"
android:layout_marginLeft="17dp"
android:layout_marginRight="17dp"
android:layout_marginTop="12dp"
android:src="@drawable/ic_edit_gray_48dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@string/text_edit_prepare_script"
android:textColor="@android:color/primary_text_light"
android:textSize="16sp"/>
</LinearLayout>
<com.stardust.scriptdroid.ui.main.script_list.ScriptListWithProgressBarView
android:id="@+id/script_list"
android:layout_width="match_parent"

View File

@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.stardust.scriptdroid.ui.edit.EditActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.stardust.theme.widget.ThemeColorToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"
app:title="@string/_app_name">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="right"
android:orientation="horizontal"
android:paddingRight="8dp">
<com.stardust.widget.ToolbarMenuItem
android:id="@+id/undo"
android:layout_width="40dp"
android:layout_height="match_parent"
app:icon="@drawable/ic_undo_white_48dp"
app:text="@string/text_undo"/>
<com.stardust.widget.ToolbarMenuItem
android:id="@+id/redo"
android:layout_width="40dp"
android:layout_height="match_parent"
app:icon="@drawable/ic_redo_white_48dp"
app:text="@string/text_redo"/>
</LinearLayout>
</com.stardust.theme.widget.ThemeColorToolbar>
<TextView
android:id="@+id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/toolbar"
android:layout_marginLeft="72dp"
android:textColor="@android:color/white"
android:textSize="10sp"
tools:text="@string/summary_pre_execute_script"/>
</RelativeLayout>
</android.support.design.widget.AppBarLayout>
<include layout="@layout/content_edit"/>
</LinearLayout>

View File

@@ -7,7 +7,8 @@
android:orientation="vertical"
android:paddingBottom="12dp"
android:paddingLeft="16dp"
android:paddingTop="12dp">
android:paddingTop="12dp"
tools:background="@color/colorPrimary">
<LinearLayout
android:layout_width="match_parent"

View File

@@ -4,6 +4,7 @@
android:layout_height="match_parent"
android:background="#f4f4f4">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -12,19 +13,26 @@
<LinearLayout
android:id="@+id/close_all"
android:layout_width="match_parent"
android:layout_height="42dp"
android:background="#e4e4e4"
android:layout_height="wrap_content"
android:background="#d4d4d4"
android:foreground="?selectableItemBackground"
android:gravity="center_vertical"
android:orientation="horizontal"
android:visibility="gone">
<ImageView
android:layout_width="22dp"
android:layout_height="22dp"
android:layout_marginBottom="12dp"
android:layout_marginLeft="17dp"
android:layout_marginRight="17dp"
android:layout_marginTop="12dp"
android:src="@drawable/ic_close_gray600_48dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_gravity="center_vertical"
android:text="@string/text_close_all_running_scripts"
android:textColor="@android:color/secondary_text_light"
android:textColor="@android:color/primary_text_light"
android:textSize="16sp"/>
</LinearLayout>

View File

@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_refresh"
android:icon="@drawable/ic_refresh_white_24dp"
android:orderInCategory="100"
android:title="@string/text_refresh"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/action_clear_file_selection"
android:orderInCategory="200"
android:title="@string/text_clear_file_selection"
app:showAsAction="never"/>
<item
android:id="@+id/action_clear_pre_execute_script"
android:orderInCategory="300"
android:title="@string/text_clear_pre_execute_script"
app:showAsAction="never"/>
</menu>

View File

@@ -188,6 +188,12 @@
<string name="text_please_choose_file_to_import">请选择要导入的脚本</string>
<string name="text_refresh">刷新</string>
<string name="notice_no_running_script"><![CDATA[没有正在运行的脚本 φ(>ω<*)]]></string>
<string name="text_please_choose_a_script">请选择脚本</string>
<string name="text_edit_prepare_script">编辑预执行脚本</string>
<string name="text_pre_execute_script">预执行脚本</string>
<string name="text_clear_pre_execute_script">清空预执行脚本</string>
<string name="text_clear_file_selection">重置脚本文件选择</string>
<string name="summary_pre_execute_script">将在脚本文件执行前执行</string>
<string-array name="record_control_keys">
<item></item>

View File

@@ -48,7 +48,7 @@
<item name="textForeground">#000000</item>
<item name="textBackground">#FFFFFF</item>
<item name="caret">#000000</item>
<item name="selection">#4D97FF54</item>
<item name="selection">@color/colorPrimary</item>
<item name="invisibles">#dddddd</item>
<item name="gutterForeground">#000000</item>
<item name="gutterBackground">#dfdfdf</item>

View File

@@ -1,5 +1,6 @@
package com.stardust.scriptdroid;
import com.jecelyin.common.http.Base64;
import com.stardust.util.LimitedHashMap;
import org.junit.Test;