diff --git a/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java b/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java index 5fe8743c..ed871681 100644 --- a/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java +++ b/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java @@ -38,6 +38,7 @@ import com.stardust.util.Supplier; import com.stardust.util.UiHandler; import com.stardust.view.accessibility.AccessibilityInfoProvider; import com.stardust.autojs.core.record.accessibility.AccessibilityActionRecorder; +import com.stardust.view.accessibility.AccessibilityNotificationObserver; import com.stardust.view.accessibility.AccessibilityService; import com.stardust.scriptdroid.tool.AccessibilityServiceTool; import com.stardust.view.accessibility.LayoutInspector; @@ -61,7 +62,7 @@ public class AutoJs { } private final AccessibilityActionRecorder mAccessibilityActionRecorder = new AccessibilityActionRecorder(); - private final NotificationListener.Observer mNotificationObserver; + private final AccessibilityNotificationObserver mNotificationObserver; private ScriptEngineManager mScriptEngineManager; private final LayoutInspector mLayoutInspector = new LayoutInspector(); private final Context mContext; @@ -85,7 +86,7 @@ public class AutoJs { return log; } }; - mNotificationObserver = new NotificationListener.Observer(context); + mNotificationObserver = new AccessibilityNotificationObserver(context); mAccessibilityInfoProvider = new AccessibilityInfoProvider(context.getPackageManager()); mScriptEngineService = buildScriptEngineService(); addAccessibilityServiceDelegates(); @@ -230,7 +231,7 @@ public class AutoJs { } @Override - public NotificationListener.Observer getNotificationObserver() { + public AccessibilityNotificationObserver getNotificationObserver() { return mNotificationObserver; } diff --git a/app/src/main/java/com/stardust/scriptdroid/pluginclient/DevPluginService.java b/app/src/main/java/com/stardust/scriptdroid/pluginclient/DevPluginService.java index 82936678..dadff420 100644 --- a/app/src/main/java/com/stardust/scriptdroid/pluginclient/DevPluginService.java +++ b/app/src/main/java/com/stardust/scriptdroid/pluginclient/DevPluginService.java @@ -13,7 +13,7 @@ public class DevPluginService { private static DevPluginService sInstance = new DevPluginService(); private DevPluginClient mClient; - private final PublishSubject mConnection = PublishSubject.create(); + private final PublishSubject mConnection = PublishSubject.create(); public static DevPluginService getInstance() { return sInstance; @@ -23,7 +23,7 @@ public class DevPluginService { return mClient != null && mClient.getState() == DevPluginClient.State.CONNECTED; } - public boolean isDisconnected(){ + public boolean isDisconnected() { return mClient == null || mClient.getState() == DevPluginClient.State.DISCONNECTED; } @@ -44,7 +44,14 @@ public class DevPluginService { } public void connectToServer(String host) { - mClient = new DevPluginClient(host, 1209, mConnection); + int port = 1209; + String ip = host; + int i = host.lastIndexOf(':'); + if (i > 0 && i < host.length() - 1) { + port = Integer.parseInt(host.substring(i + 1)); + ip = host.substring(0, i); + } + mClient = new DevPluginClient(ip, port, mConnection); mClient.setResponseHandler(new DevPluginResponseHandler()); mClient.connectToServer(); } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorMenu.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorMenu.java index 5af98ba6..c73a7e49 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorMenu.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorMenu.java @@ -163,45 +163,29 @@ public class EditorMenu { private void jumpToLine() { mEditor.getLineCount() .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Consumer() { - @Override - public void accept(@NonNull Integer lineCount) throws Exception { - showJumpDialog(lineCount); - } - }); + .subscribe(this::showJumpDialog); } private void showJumpDialog(final int lineCount) { String hint = "1 ~ " + lineCount; new ThemeColorMaterialDialogBuilder(mContext) .title(R.string.text_jump_to_line) - .input(hint, "", new MaterialDialog.InputCallback() { - @Override - public void onInput(@android.support.annotation.NonNull MaterialDialog dialog, CharSequence input) { - int line = Integer.parseInt(input.toString()); - mEditor.jumpTo(line - 1, 0); - } + .input(hint, "", (dialog, input) -> { + int line = Integer.parseInt(input.toString()); + mEditor.jumpTo(line - 1, 0); }) .inputType(InputType.TYPE_CLASS_NUMBER) .show(); } private void showInfo() { - Observable.zip(mEditor.getText(), mEditor.getLineCount(), new BiFunction() { - @Override - public String apply(@NonNull String text, @NonNull Integer lineCount) throws Exception { - String size = PFiles.getHumanReadableSize(text.length()); - return String.format(Locale.getDefault(), mContext.getString(R.string.format_editor_info), - text.length(), lineCount, size); - } + Observable.zip(mEditor.getText(), mEditor.getLineCount(), (text, lineCount) -> { + String size = PFiles.getHumanReadableSize(text.length()); + return String.format(Locale.getDefault(), mContext.getString(R.string.format_editor_info), + text.length(), lineCount, size); }) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Consumer() { - @Override - public void accept(@NonNull String info) throws Exception { - showInfo(info); - } - }); + .subscribe(this::showInfo); } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/user/LoginActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/user/LoginActivity.java index 4661d02c..9be95e52 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/user/LoginActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/user/LoginActivity.java @@ -1,9 +1,9 @@ package com.stardust.scriptdroid.ui.user; -import android.annotation.SuppressLint; import android.content.Intent; import android.view.Menu; import android.view.MenuItem; +import android.view.View; import android.widget.TextView; import android.widget.Toast; @@ -12,6 +12,7 @@ import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.network.NodeBB; import com.stardust.scriptdroid.network.UserService; import com.stardust.scriptdroid.ui.BaseActivity; +import com.stardust.theme.ThemeColorManager; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.Click; @@ -33,9 +34,13 @@ public class LoginActivity extends BaseActivity { @ViewById(R.id.password) TextView mPassword; + @ViewById(R.id.login) + View mLogin; + @AfterViews void setUpViews() { setToolbarAsBack(getString(R.string.text_login)); + ThemeColorManager.addViewBackground(mLogin); } @Click(R.id.login) diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/user/RegisterActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/user/RegisterActivity.java index 33aaad4a..121e3b19 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/user/RegisterActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/user/RegisterActivity.java @@ -2,6 +2,7 @@ package com.stardust.scriptdroid.ui.user; import android.util.Log; import android.util.Patterns; +import android.view.View; import android.widget.TextView; import android.widget.Toast; @@ -9,6 +10,7 @@ import com.afollestad.materialdialogs.MaterialDialog; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.network.UserService; import com.stardust.scriptdroid.ui.BaseActivity; +import com.stardust.theme.ThemeColorManager; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.Click; @@ -33,9 +35,14 @@ public class RegisterActivity extends BaseActivity { @ViewById(R.id.password) TextView mPassword; + @ViewById(R.id.register) + View mRegister; + + @AfterViews void setUpViews() { setToolbarAsBack(getString(R.string.text_register)); + ThemeColorManager.addViewBackground(mRegister); } @Click(R.id.register) diff --git a/app/src/main/res/layout/activity_build.xml b/app/src/main/res/layout/activity_build.xml index 95769116..7be994c9 100644 --- a/app/src/main/res/layout/activity_build.xml +++ b/app/src/main/res/layout/activity_build.xml @@ -17,6 +17,7 @@ + - = Build.VERSION_CODES.JELLY_BEAN_MR2 && NotificationListenerService.getInstance() != null) { NotificationListenerService.getInstance().removeListener(this); @@ -221,4 +223,14 @@ public class Events extends EventEmitter implements OnKeyListener, TouchObserver }); } + + @Override + public void onToast(final AccessibilityNotificationObserver.Toast toast) { + mHandler.post(new Runnable() { + @Override + public void run() { + emit("toast", toast); + } + }); + } } diff --git a/autojs/src/main/java/com/stardust/autojs/util/ProcessUtils.java b/autojs/src/main/java/com/stardust/autojs/util/ProcessUtils.java index 5a4f2a8d..365c4c1d 100644 --- a/autojs/src/main/java/com/stardust/autojs/util/ProcessUtils.java +++ b/autojs/src/main/java/com/stardust/autojs/util/ProcessUtils.java @@ -15,15 +15,6 @@ public class ProcessUtils { private static final String LOG_TAG = "ProcessUtils"; - // FIXME: 2017/8/3 - public static void killProcessTree(Process process) { - int pid = getProcessPid(process); - if (pid >= 0) - kill(pid); - process.destroy(); - - } - public static int getProcessPid(Process process) { try { Field pid = process.getClass().getDeclaredField("pid"); @@ -35,9 +26,4 @@ public class ProcessUtils { } } - public static void kill(int pid) { - String cmd = "kill -TERM -- -" + pid; - Log.d(LOG_TAG, cmd); - ProcessShell.exec(cmd, true); - } } diff --git a/automator/src/main/java/com/stardust/notification/Notification.java b/automator/src/main/java/com/stardust/notification/Notification.java index 747eb1d0..ecb388db 100644 --- a/automator/src/main/java/com/stardust/notification/Notification.java +++ b/automator/src/main/java/com/stardust/notification/Notification.java @@ -53,6 +53,18 @@ public class Notification extends android.app.Notification { } } + @Override + public String toString() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + return "Notification{" + + "packageName='" + mPackageName + '\'' + + "title = " + getTitle() + '\'' + + "text='" + getText() + '\'' + + "} "; + } + return super.toString(); + } + public static void clone(android.app.Notification from, android.app.Notification to) { to.when = from.when; to.icon = from.icon; diff --git a/automator/src/main/java/com/stardust/view/accessibility/AccessibilityNotificationObserver.java b/automator/src/main/java/com/stardust/view/accessibility/AccessibilityNotificationObserver.java new file mode 100644 index 00000000..e17478a7 --- /dev/null +++ b/automator/src/main/java/com/stardust/view/accessibility/AccessibilityNotificationObserver.java @@ -0,0 +1,146 @@ +package com.stardust.view.accessibility; + +import android.accessibilityservice.*; +import android.content.Context; +import android.support.annotation.Nullable; +import android.util.Log; +import android.view.accessibility.AccessibilityEvent; + +import com.stardust.notification.Notification; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * Created by Stardust on 2017/11/3. + */ + +public class AccessibilityNotificationObserver implements NotificationListener, AccessibilityDelegate { + + public class Toast { + public final List texts; + public final String packageName; + + public Toast(String packageName, List texts) { + this.texts = new ArrayList<>(texts.size()); + for (CharSequence t : texts) { + if (t != null) { + this.texts.add(t.toString()); + } + } + this.packageName = packageName; + } + + public String getText() { + if (texts.isEmpty()) { + return null; + } + CharSequence text = texts.get(0); + if (text == null) { + return null; + } + return text.toString(); + } + + public List getTexts() { + return texts; + } + + public String getPackageName() { + return packageName; + } + + @Override + public String toString() { + return "Toast{" + + "texts=" + texts + + ", packageName='" + packageName + '\'' + + '}'; + } + } + + public interface ToastListener { + void onToast(Toast toast); + } + + private static final Set EVENT_TYPES = Collections.singleton(AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED); + + private static final String TAG = "NotificationObserver"; + private static final String[] EMPTY = new String[0]; + + private Context mContext; + private CopyOnWriteArrayList mNotificationListeners = new CopyOnWriteArrayList<>(); + private CopyOnWriteArrayList mToastListeners = new CopyOnWriteArrayList<>(); + + public AccessibilityNotificationObserver(Context context) { + mContext = context; + } + + + public void addNotificationListener(NotificationListener listener) { + mNotificationListeners.add(listener); + } + + public boolean removeNotificationListener(NotificationListener listener) { + return mNotificationListeners.remove(listener); + } + + + public void addToastListener(ToastListener listener) { + mToastListeners.add(listener); + } + + public boolean removeToastListener(ToastListener listener) { + return mToastListeners.remove(listener); + } + + @Override + public boolean onAccessibilityEvent(android.accessibilityservice.AccessibilityService service, AccessibilityEvent event) { + if (event.getParcelableData() instanceof Notification) { + android.app.Notification notification = (android.app.Notification) event.getParcelableData(); + Log.d(TAG, "onNotification: " + notification + "; " + event); + onNotification(Notification.create(notification, event.getPackageName().toString())); + } else { + List list = event.getText(); + Log.d(TAG, "onNotification: " + list + "; " + event); + if (event.getPackageName().equals(mContext.getPackageName())) { + return false; + } + if (list != null) { + onToast(event, new Toast(event.getPackageName().toString(), list)); + } + } + + return false; + } + + private void onToast(AccessibilityEvent event, Toast toast) { + for (ToastListener listener : mToastListeners) { + try { + listener.onToast(toast); + } catch (Exception e) { + Log.e(TAG, "Error onNotification: " + toast + " Listener: " + listener, e); + } + } + } + + @Nullable + @Override + public Set getEventTypes() { + return EVENT_TYPES; + } + + @Override + public void onNotification(Notification notification) { + for (NotificationListener listener : mNotificationListeners) { + try { + listener.onNotification(notification); + } catch (Exception e) { + Log.e(TAG, "Error onNotification: " + notification + " Listener: " + listener, e); + } + } + } +} diff --git a/automator/src/main/java/com/stardust/view/accessibility/NotificationListener.java b/automator/src/main/java/com/stardust/view/accessibility/NotificationListener.java index 6cc19bce..f43911cc 100644 --- a/automator/src/main/java/com/stardust/view/accessibility/NotificationListener.java +++ b/automator/src/main/java/com/stardust/view/accessibility/NotificationListener.java @@ -22,112 +22,7 @@ import java.util.concurrent.CopyOnWriteArrayList; public interface NotificationListener { - class NotificationInfo { - - private String mPackageName; - private String mText; - private List mTexts; - - public NotificationInfo(String packageName, List texts) { - mPackageName = packageName; - mTexts = texts; - if (mTexts.size() > 0) { - mText = mTexts.get(0); - } - } - - public NotificationInfo(CharSequence packageName, List list) { - mPackageName = packageName == null ? "" : packageName.toString(); - mTexts = new ArrayList<>(list.size()); - for (CharSequence text : list) { - if (text != null) { - mTexts.add(text.toString()); - } - } - if (mTexts.size() > 0) { - mText = mTexts.get(0); - } - } - - - public static NotificationInfo fromEvent(AccessibilityEvent event) { - return new NotificationInfo(event.getPackageName(), event.getText()); - } - - public String getPackageName() { - return mPackageName; - } - - public String getText() { - return mText; - } - - public List getTexts() { - return mTexts; - } - - @Override - public String toString() { - return "NotificationInfo{" + - "packageName='" + mPackageName + '\'' + - ", text='" + mText + '\'' + - ", texts=" + mTexts + - '}'; - } - } - - void onNotification(Notification notification); - class Observer implements NotificationListener, AccessibilityDelegate { - - private static final Set EVENT_TYPES = Collections.singleton(AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED); - - private static final String TAG = "NotificationObserver"; - private static final String[] EMPTY = new String[0]; - - private Context mContext; - private CopyOnWriteArrayList mNotificationListeners = new CopyOnWriteArrayList<>(); - - public Observer(Context context) { - mContext = context; - } - - - public void addListener(NotificationListener listener) { - mNotificationListeners.add(listener); - } - - public boolean removeListener(NotificationListener listener) { - return mNotificationListeners.remove(listener); - } - - @Override - public boolean onAccessibilityEvent(AccessibilityService service, AccessibilityEvent event) { - if (event.getParcelableData() instanceof Notification) { - android.app.Notification notification = (android.app.Notification) event.getParcelableData(); - Log.d(TAG, "onNotification: " + notification + "; " + event); - onNotification(Notification.create(notification, event.getPackageName().toString())); - } - return false; - } - - @Nullable - @Override - public Set getEventTypes() { - return EVENT_TYPES; - } - - @Override - public void onNotification(Notification notification) { - for (NotificationListener listener : mNotificationListeners) { - try { - listener.onNotification(notification); - } catch (Exception e) { - Log.e(TAG, "Error onNotification: " + notification + " Listener: " + listener, e); - } - } - } - } } diff --git a/common/src/main/java/com/stardust/app/OnActivityResultDelegate.java b/common/src/main/java/com/stardust/app/OnActivityResultDelegate.java index f9db8b2d..03f49ee1 100644 --- a/common/src/main/java/com/stardust/app/OnActivityResultDelegate.java +++ b/common/src/main/java/com/stardust/app/OnActivityResultDelegate.java @@ -45,7 +45,6 @@ public interface OnActivityResultDelegate { public void removeDelegate(OnActivityResultDelegate delegate) { if (mDelegates.remove(delegate)) { - // TODO: 2017/3/16 优化 mSpecialDelegate.removeAt(mSpecialDelegate.indexOfValue(delegate)); } } diff --git a/inrt/src/main/java/com/stardust/auojs/inrt/rt/AutoJs.java b/inrt/src/main/java/com/stardust/auojs/inrt/rt/AutoJs.java index 723434ec..28663dc2 100644 --- a/inrt/src/main/java/com/stardust/auojs/inrt/rt/AutoJs.java +++ b/inrt/src/main/java/com/stardust/auojs/inrt/rt/AutoJs.java @@ -58,7 +58,7 @@ public class AutoJs { } private final AccessibilityActionRecorder mAccessibilityActionRecorder = new AccessibilityActionRecorder(); - private final NotificationListener.Observer mNotificationObserver; + private final NotificationListener.AccessibilityNotificationObserver mNotificationObserver; private ScriptEngineManager mScriptEngineManager; private final Context mContext; private final UiHandler mUiHandler; @@ -74,7 +74,7 @@ public class AutoJs { mUiHandler = new UiHandler(context); mAppUtils = new AppUtils(context); mGlobalConsole = new GlobalStardustConsole(mUiHandler); - mNotificationObserver = new NotificationListener.Observer(context); + mNotificationObserver = new NotificationListener.AccessibilityNotificationObserver(context); mAccessibilityInfoProvider = new AccessibilityInfoProvider(context.getPackageManager()); mScriptEngineService = buildScriptEngineService(); addAccessibilityServiceDelegates(); @@ -198,7 +198,7 @@ public class AutoJs { } @Override - public NotificationListener.Observer getNotificationObserver() { + public NotificationListener.AccessibilityNotificationObserver getNotificationObserver() { return mNotificationObserver; }