diff --git a/app-release-1.17.0216.apk b/app-release-1.17.0216(1).apk similarity index 59% rename from app-release-1.17.0216.apk rename to app-release-1.17.0216(1).apk index e4b8f48e..c228f548 100644 Binary files a/app-release-1.17.0216.apk and b/app-release-1.17.0216(1).apk differ diff --git a/app/app-release.apk b/app/app-release.apk deleted file mode 100644 index dd09e415..00000000 Binary files a/app/app-release.apk and /dev/null differ diff --git a/app/build.gradle b/app/build.gradle index ddf58e63..a7070d88 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,8 +7,8 @@ android { applicationId "com.stardust.scriptdroid" minSdkVersion 19 targetSdkVersion 23 - versionCode 28 - versionName "1.17.0216" + versionCode 29 + versionName "1.17.0216(1)" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { @@ -68,8 +68,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 'org.msgpack:msgpack-core:0.8.11' compile(name: '920-common-release', ext: 'aar') - compile(name: '920-styles-debug', ext: 'aar') + compile(name: '920-styles-release', ext: 'aar') compile(name: '920-file_explorer-release', ext: 'aar') compile(name: '920-app-debug', ext: 'aar') diff --git a/app/libs/920-app-debug.aar b/app/libs/920-app-debug.aar index 7904d534..8fddb4be 100644 Binary files a/app/libs/920-app-debug.aar and b/app/libs/920-app-debug.aar differ diff --git a/app/libs/920-common-release.aar b/app/libs/920-common-release.aar index e5626de0..d2e091b6 100644 Binary files a/app/libs/920-common-release.aar and b/app/libs/920-common-release.aar differ diff --git a/app/libs/920-file_explorer-release.aar b/app/libs/920-file_explorer-release.aar index 2e65988a..cd7f9361 100644 Binary files a/app/libs/920-file_explorer-release.aar and b/app/libs/920-file_explorer-release.aar differ diff --git a/app/libs/920-styles-debug.aar b/app/libs/920-styles-debug.aar deleted file mode 100644 index 6633b951..00000000 Binary files a/app/libs/920-styles-debug.aar and /dev/null differ diff --git a/app/libs/920-styles-release.aar b/app/libs/920-styles-release.aar index aada017f..2c4cb56d 100644 Binary files a/app/libs/920-styles-release.aar and b/app/libs/920-styles-release.aar differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8303add1..81c7df88 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -86,7 +86,8 @@ - + + (this); stateObserver = new StateObserver(PreferenceManager.getDefaultSharedPreferences(this)); registerActivityLifecycleCallback(); diff --git a/app/src/main/java/com/stardust/scriptdroid/Pref.java b/app/src/main/java/com/stardust/scriptdroid/Pref.java index 36f52802..748af4fb 100644 --- a/app/src/main/java/com/stardust/scriptdroid/Pref.java +++ b/app/src/main/java/com/stardust/scriptdroid/Pref.java @@ -32,7 +32,15 @@ public class Pref { return getDisposableBoolean("isFirstGoToAccessibilitySetting", true); } - public static int oldVersion(){ + public static int oldVersion() { return 0; } + + public static boolean isRecordVolumeControlEnable() { + return def().getBoolean(getString(R.string.key_use_volume_control_record), false); + } + + private static String getString(int id) { + return App.getApp().getString(id); + } } diff --git a/app/src/main/java/com/stardust/scriptdroid/droid/runtime/action/FilterAction.java b/app/src/main/java/com/stardust/scriptdroid/droid/runtime/action/FilterAction.java index 1b7c5b50..39c657bf 100644 --- a/app/src/main/java/com/stardust/scriptdroid/droid/runtime/action/FilterAction.java +++ b/app/src/main/java/com/stardust/scriptdroid/droid/runtime/action/FilterAction.java @@ -96,11 +96,13 @@ public abstract class FilterAction extends Action { List editableList = findEditable(root); if (mIndex == -1) return editableList; + if (mIndex >= editableList.size()) + return Collections.EMPTY_LIST; return Collections.singletonList(editableList.get(mIndex)); } @SuppressWarnings("unchecked") - private List findEditable(AccessibilityNodeInfo root) { + public static List findEditable(AccessibilityNodeInfo root) { if (root == null) { return Collections.EMPTY_LIST; } diff --git a/app/src/main/java/com/stardust/scriptdroid/external/notification/record/ActionRecordNotificationHandleService.java b/app/src/main/java/com/stardust/scriptdroid/external/notification/record/ActionRecordSwitchHandleService.java similarity index 69% rename from app/src/main/java/com/stardust/scriptdroid/external/notification/record/ActionRecordNotificationHandleService.java rename to app/src/main/java/com/stardust/scriptdroid/external/notification/record/ActionRecordSwitchHandleService.java index 2ba5e1c8..cf27e8e3 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/notification/record/ActionRecordNotificationHandleService.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/notification/record/ActionRecordSwitchHandleService.java @@ -2,6 +2,7 @@ package com.stardust.scriptdroid.external.notification.record; import android.app.PendingIntent; import android.app.Service; +import android.content.Context; import android.content.Intent; import android.os.IBinder; import android.support.annotation.Nullable; @@ -11,6 +12,7 @@ import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.record.AccessibilityRecorderDelegate; import com.stardust.scriptdroid.service.AccessibilityWatchDogService; +import com.stardust.scriptdroid.service.VolumeChangeListenService; import com.stardust.scriptdroid.ui.main.MainActivity; import static com.stardust.scriptdroid.external.notification.record.ActionRecordSwitchView.PAUSED; @@ -21,10 +23,10 @@ import static com.stardust.scriptdroid.external.notification.record.ActionRecord * Created by Stardust on 2017/2/15. */ -public class ActionRecordNotificationHandleService extends Service { +public class ActionRecordSwitchHandleService extends Service { - private static final String EXTRA_INTENT_VALID = "ActionRecordNotificationHandleService.intentValid"; + private static final String EXTRA_INTENT_VALID = "ActionRecordSwitchHandleService.intentValid"; private static final String EXTRA_ACTION = "action"; private static final int ACTION_STOP = 17771; private static final int ACTION_START_OR_PAUSE = 17772; @@ -32,21 +34,21 @@ public class ActionRecordNotificationHandleService extends Service { private static final int ACTION_REDO = 17774; public static PendingIntent getStartOrPauseIntent() { - Intent intent = new Intent(App.getApp(), ActionRecordNotificationHandleService.class) + Intent intent = new Intent(App.getApp(), ActionRecordSwitchHandleService.class) .putExtra(EXTRA_INTENT_VALID, true) .putExtra(EXTRA_ACTION, ACTION_START_OR_PAUSE); return PendingIntent.getService(App.getApp(), ACTION_START_OR_PAUSE, intent, PendingIntent.FLAG_UPDATE_CURRENT); } public static PendingIntent getStopIntent() { - Intent intent = new Intent(App.getApp(), ActionRecordNotificationHandleService.class) + Intent intent = new Intent(App.getApp(), ActionRecordSwitchHandleService.class) .putExtra(EXTRA_INTENT_VALID, true) .putExtra(EXTRA_ACTION, ACTION_STOP); return PendingIntent.getService(App.getApp(), ACTION_STOP, intent, PendingIntent.FLAG_UPDATE_CURRENT); } public static PendingIntent getDeleteIntent() { - Intent intent = new Intent(App.getApp(), ActionRecordNotificationHandleService.class) + Intent intent = new Intent(App.getApp(), ActionRecordSwitchHandleService.class) .putExtra(EXTRA_INTENT_VALID, true) .putExtra(EXTRA_ACTION, ACTION_DELETE); return PendingIntent.getService(App.getApp(), ACTION_DELETE, intent, PendingIntent.FLAG_UPDATE_CURRENT); @@ -54,7 +56,7 @@ public class ActionRecordNotificationHandleService extends Service { public static PendingIntent getRedoIntent() { - Intent intent = new Intent(App.getApp(), ActionRecordNotificationHandleService.class) + Intent intent = new Intent(App.getApp(), ActionRecordSwitchHandleService.class) .putExtra(EXTRA_INTENT_VALID, true) .putExtra(EXTRA_ACTION, ACTION_REDO); return PendingIntent.getService(App.getApp(), ACTION_REDO, intent, PendingIntent.FLAG_UPDATE_CURRENT); @@ -74,19 +76,20 @@ public class ActionRecordNotificationHandleService extends Service { private void performAction(int action) { switch (action) { case ACTION_STOP: - stopRecord(); + stopRecord(this); collapseNotificationBar(); break; case ACTION_START_OR_PAUSE: - startOrPauseRecord(); + startOrPauseRecord(this); collapseNotificationBar(); break; case ACTION_DELETE: ActionRecordSwitchNotification.cancelNotification(); stopRecordIfNeeded(); + VolumeChangeListenService.stopServiceIfNeeded(); break; case ACTION_REDO: - redoRecord(); + redoRecord(this); break; } } @@ -98,41 +101,53 @@ public class ActionRecordNotificationHandleService extends Service { private void stopRecordIfNeeded() { if (AccessibilityRecorderDelegate.getInstance().getState() != STOPPED) { - stopRecord(); + stopRecord(this); } } - private void startOrPauseRecord() { + private static void startOrPauseRecord(Context context) { int state = AccessibilityRecorderDelegate.getInstance().getState(); if (state == PAUSED) { - AccessibilityRecorderDelegate.getInstance().resumeRecord(); - ActionRecordSwitchView.getInstance().setState(RECORDING); + resumeRecord(context); } else if (state == RECORDING) { - AccessibilityRecorderDelegate.getInstance().pauseRecord(); - ActionRecordSwitchView.getInstance().setState(PAUSED); + pauseRecord(context); } else { //state == STOPPED - if (AccessibilityWatchDogService.getInstance() == null) { - Toast.makeText(this, R.string.text_need_enable_accessibility_service, Toast.LENGTH_SHORT).show(); - return; - } - AccessibilityRecorderDelegate.getInstance().startRecord(); - ActionRecordSwitchView.getInstance().setState(RECORDING); - Toast.makeText(this, R.string.text_start_record, Toast.LENGTH_SHORT).show(); + startRecord(context); } } - private void stopRecord() { + public static void startRecord(Context context) { + if (AccessibilityWatchDogService.getInstance() == null) { + Toast.makeText(context, R.string.text_need_enable_accessibility_service, Toast.LENGTH_SHORT).show(); + return; + } + AccessibilityRecorderDelegate.getInstance().startRecord(); + ActionRecordSwitchView.getInstance().setState(RECORDING); + Toast.makeText(context, R.string.text_start_record, Toast.LENGTH_SHORT).show(); + } + + private static void pauseRecord(Context context) { + AccessibilityRecorderDelegate.getInstance().pauseRecord(); + ActionRecordSwitchView.getInstance().setState(PAUSED); + } + + private static void resumeRecord(Context context) { + AccessibilityRecorderDelegate.getInstance().resumeRecord(); + ActionRecordSwitchView.getInstance().setState(RECORDING); + } + + public static void stopRecord(Context context) { if (AccessibilityRecorderDelegate.getInstance().getState() != STOPPED) { String script = AccessibilityRecorderDelegate.getInstance().stopRecord(); ActionRecordSwitchView.getInstance().setState(STOPPED); - MainActivity.onActionRecordStopped(this, script); + MainActivity.onActionRecordStopped(context, script); } else { Toast.makeText(App.getApp(), R.string.text_not_recording, Toast.LENGTH_SHORT).show(); } } - private void redoRecord() { + private static void redoRecord(Context context) { if (AccessibilityRecorderDelegate.getInstance().getState() != STOPPED) { AccessibilityRecorderDelegate.getInstance().stopRecord(); ActionRecordSwitchView.getInstance().setState(STOPPED); diff --git a/app/src/main/java/com/stardust/scriptdroid/external/notification/record/ActionRecordSwitchNotification.java b/app/src/main/java/com/stardust/scriptdroid/external/notification/record/ActionRecordSwitchNotification.java index 91b389ba..859cb588 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/notification/record/ActionRecordSwitchNotification.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/notification/record/ActionRecordSwitchNotification.java @@ -7,6 +7,7 @@ import android.support.v4.app.NotificationCompat; import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.R; +import com.stardust.scriptdroid.service.VolumeChangeListenService; /** * Created by Stardust on 2017/2/14. @@ -23,10 +24,11 @@ public class ActionRecordSwitchNotification { builder = new NotificationCompat.Builder(App.getApp()) .setAutoCancel(false) .setSmallIcon(R.drawable.ic_robot_head) - .setDeleteIntent(ActionRecordNotificationHandleService.getDeleteIntent()) + .setDeleteIntent(ActionRecordSwitchHandleService.getDeleteIntent()) .setCustomContentView(ActionRecordSwitchView.getInstance()); } showNotification(builder.build()); + VolumeChangeListenService.startServiceIfNeeded(App.getApp()); } private static void showNotification(Notification notification) { diff --git a/app/src/main/java/com/stardust/scriptdroid/external/notification/record/ActionRecordSwitchView.java b/app/src/main/java/com/stardust/scriptdroid/external/notification/record/ActionRecordSwitchView.java index 6b45e1e7..cf861369 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/notification/record/ActionRecordSwitchView.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/notification/record/ActionRecordSwitchView.java @@ -48,9 +48,9 @@ public class ActionRecordSwitchView extends RemoteViews { } private void setUpOnClick() { - setOnClickPendingIntent(R.id.stop, ActionRecordNotificationHandleService.getStopIntent()); - setOnClickPendingIntent(R.id.start_or_pause, ActionRecordNotificationHandleService.getStartOrPauseIntent()); - setOnClickPendingIntent(R.id.close, ActionRecordNotificationHandleService.getDeleteIntent()); - setOnClickPendingIntent(R.id.redo, ActionRecordNotificationHandleService.getRedoIntent()); + setOnClickPendingIntent(R.id.stop, ActionRecordSwitchHandleService.getStopIntent()); + setOnClickPendingIntent(R.id.start_or_pause, ActionRecordSwitchHandleService.getStartOrPauseIntent()); + setOnClickPendingIntent(R.id.close, ActionRecordSwitchHandleService.getDeleteIntent()); + setOnClickPendingIntent(R.id.redo, ActionRecordSwitchHandleService.getRedoIntent()); } } diff --git a/app/src/main/java/com/stardust/scriptdroid/external/shortcut/ShortcutActivity.java b/app/src/main/java/com/stardust/scriptdroid/external/shortcut/ShortcutActivity.java index ad651dc7..e303d7ba 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/shortcut/ShortcutActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/shortcut/ShortcutActivity.java @@ -97,8 +97,11 @@ public class ShortcutActivity extends Activity { } private boolean hasStorageReadPermission() { - return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && - checkSelfPermission(READ_EXTERNAL_STORAGE) == PERMISSION_GRANTED; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + return Build.VERSION.SDK_INT < Build.VERSION_CODES.M || + checkSelfPermission(READ_EXTERNAL_STORAGE) == PERMISSION_GRANTED; + } + return true; } interface Tile { diff --git a/app/src/main/java/com/stardust/scriptdroid/record/AccessibilityRecorderDelegate.java b/app/src/main/java/com/stardust/scriptdroid/record/AccessibilityRecorderDelegate.java index 94031788..7f0ee389 100644 --- a/app/src/main/java/com/stardust/scriptdroid/record/AccessibilityRecorderDelegate.java +++ b/app/src/main/java/com/stardust/scriptdroid/record/AccessibilityRecorderDelegate.java @@ -80,7 +80,7 @@ public class AccessibilityRecorderDelegate implements AccessibilityDelegate { @Override public boolean onAccessibilityEvent(AccessibilityService service, AccessibilityEvent event) { if (mState == RECORDING) { - mRecorder.record(event); + mRecorder.record(service, event); checkTimeOut(); } return false; diff --git a/app/src/main/java/com/stardust/scriptdroid/record/ActionRecorder.java b/app/src/main/java/com/stardust/scriptdroid/record/ActionRecorder.java index cbc5b165..4daa2d61 100644 --- a/app/src/main/java/com/stardust/scriptdroid/record/ActionRecorder.java +++ b/app/src/main/java/com/stardust/scriptdroid/record/ActionRecorder.java @@ -1,12 +1,16 @@ package com.stardust.scriptdroid.record; +import android.accessibilityservice.AccessibilityService; import android.os.Build; import android.util.SparseArray; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; +import com.stardust.scriptdroid.droid.runtime.action.FilterAction; import com.stardust.util.SparseArrayEntries; +import java.util.List; + import static com.stardust.scriptdroid.bounds_assist.BoundsAssistant.boundsToString; import static com.stardust.scriptdroid.bounds_assist.BoundsAssistant.getBoundsInScreen; @@ -21,6 +25,7 @@ public class ActionRecorder { .entry(AccessibilityEvent.TYPE_VIEW_CLICKED, new DoUtilSucceedConverter("click")) .entry(AccessibilityEvent.TYPE_VIEW_LONG_CLICKED, new DoUtilSucceedConverter("longClick")) .entry(AccessibilityEvent.TYPE_VIEW_SCROLLED, new DoOnceConverter("//scroll???")) + .entry(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED, new SetTextEventConverter()) .sparseArray(); static { @@ -32,14 +37,14 @@ public class ActionRecorder { private StringBuilder mScript = new StringBuilder(); private boolean mFirstAction = true; - public void record(AccessibilityEvent event) { + public void record(AccessibilityService service, AccessibilityEvent event) { EventToScriptConverter converter = CONVERTER_MAP.get(event.getEventType()); if (converter != null) { if (mFirstAction) { mFirstAction = false; return; } - converter.onAccessibilityEvent(event, mScript); + converter.onAccessibilityEvent(service, event, mScript); mScript.append("\n"); } } @@ -54,13 +59,13 @@ public class ActionRecorder { interface EventToScriptConverter { - void onAccessibilityEvent(AccessibilityEvent event, StringBuilder sb); + void onAccessibilityEvent(AccessibilityService service, AccessibilityEvent event, StringBuilder sb); } private static abstract class BoundsEventConverter implements EventToScriptConverter { @Override - public void onAccessibilityEvent(AccessibilityEvent event, StringBuilder sb) { + public void onAccessibilityEvent(AccessibilityService service, AccessibilityEvent event, StringBuilder sb) { AccessibilityNodeInfo source = event.getSource(); if (source == null) return; @@ -101,4 +106,37 @@ public class ActionRecorder { } } + private static class SetTextEventConverter implements EventToScriptConverter { + + @Override + public void onAccessibilityEvent(AccessibilityService service, AccessibilityEvent event, StringBuilder sb) { + AccessibilityNodeInfo source = event.getSource(); + if (source == null) + return; + List editableList = FilterAction.EditableFilter.findEditable(service.getRootInActiveWindow()); + int i = findInEditableList(editableList, source); + recycle(editableList); + sb.append("while(!input(").append(i).append(", \"").append(source.getText()).append("\"));"); + source.recycle(); + } + + private void recycle(List list) { + for (AccessibilityNodeInfo nodeInfo : list) { + nodeInfo.recycle(); + } + } + + + private static int findInEditableList(List editableList, AccessibilityNodeInfo editable) { + int i = 0; + for (AccessibilityNodeInfo nodeInfo : editableList) { + if (getBoundsInScreen(nodeInfo).equals(getBoundsInScreen(editable))) { + return i; + } + i++; + } + return -1; + } + } + } diff --git a/app/src/main/java/com/stardust/scriptdroid/service/AccessibilityWatchDogService.java b/app/src/main/java/com/stardust/scriptdroid/service/AccessibilityWatchDogService.java index bb66fbbd..e6786f64 100644 --- a/app/src/main/java/com/stardust/scriptdroid/service/AccessibilityWatchDogService.java +++ b/app/src/main/java/com/stardust/scriptdroid/service/AccessibilityWatchDogService.java @@ -69,7 +69,7 @@ public class AccessibilityWatchDogService extends AccessibilityService { } @Override - public synchronized void onAccessibilityEvent(AccessibilityEvent event) { + public void onAccessibilityEvent(AccessibilityEvent event) { Log.v(TAG, "onAccessibilityEvent: " + event); synchronized (mDelegates) { for (Map.Entry entry : mDelegates.entrySet()) { diff --git a/app/src/main/java/com/stardust/scriptdroid/service/VolumeChangeListenService.java b/app/src/main/java/com/stardust/scriptdroid/service/VolumeChangeListenService.java new file mode 100644 index 00000000..ddc2f84e --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/service/VolumeChangeListenService.java @@ -0,0 +1,86 @@ +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 com.stardust.scriptdroid.Pref; +import com.stardust.scriptdroid.external.notification.record.ActionRecordSwitchHandleService; +import com.stardust.scriptdroid.record.AccessibilityRecorderDelegate; + +import java.lang.ref.WeakReference; + +import static com.stardust.scriptdroid.external.notification.record.ActionRecordSwitchView.STOPPED; + +/** + * Created by Stardust on 2017/2/16. + */ + +public class VolumeChangeListenService extends Service { + + private static final String ACTION_VOLUME_CHANGE = "android.media.VOLUME_CHANGED_ACTION"; + + private VolumeChangeReceiver mVolumeChangeReceiver; + private static WeakReference instance; + + public static void stopServiceIfNeeded() { + if (instance != null || instance.get() != null) { + instance.get().stopSelf(); + } + } + + public static void startServiceIfNeeded(Context context) { + if (Pref.isRecordVolumeControlEnable() && (instance == null || instance.get() == null)) { + context.startService(new Intent(context, VolumeChangeListenService.class)); + } + } + + + @Override + public void onCreate() { + super.onCreate(); + if (instance != null && instance.get() != null) { + instance.get().stopSelf(); + } + instance = new WeakReference<>(this); + 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(); + if (AccessibilityRecorderDelegate.getInstance().getState() == STOPPED) { + ActionRecordSwitchHandleService.startRecord(VolumeChangeListenService.this); + } else { + ActionRecordSwitchHandleService.stopRecord(VolumeChangeListenService.this); + } + } + } + } + +} diff --git a/app/src/main/java/com/stardust/scriptdroid/tool/IntentTool.java b/app/src/main/java/com/stardust/scriptdroid/tool/IntentTool.java index 0e23a223..fe4fec54 100644 --- a/app/src/main/java/com/stardust/scriptdroid/tool/IntentTool.java +++ b/app/src/main/java/com/stardust/scriptdroid/tool/IntentTool.java @@ -12,15 +12,37 @@ import com.stardust.scriptdroid.R; */ public class IntentTool { - public static void goToQQ(Context context, String qq) { + public static boolean 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))); + return true; } catch (Exception exception) { exception.printStackTrace(); + return false; } } + /**************** + * 发起添加群流程。群号:免Root脚本精灵交流群(556928653) 的 key 为: vjHXzZlpGcXNe-YEWzQ85mm_z8y-curC + * 调用 joinQQGroup(vjHXzZlpGcXNe-YEWzQ85mm_z8y-curC) 即可发起手Q客户端申请加群 免Root脚本精灵交流群(556928653) + * + * @param key 由官网生成的key + * @return 返回true表示呼起手Q成功,返回false表示呼起失败 + ******************/ + public static boolean joinQQGroup(Context context, String key) { + Intent intent = new Intent(); + intent.setData(Uri.parse("mqqopensdkapi://bizAgent/qm/qr?url=http%3A%2F%2Fqm.qq.com%2Fcgi-bin%2Fqm%2Fqr%3Ffrom%3Dapp%26p%3Dandroid%26k%3D" + key)); + // 此Flag可根据具体产品需要自定义,如设置,则在加群界面按返回,返回手Q主界面,不设置,按返回会返回到呼起产品界面 //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + try { + context.startActivity(intent); + return true; + } catch (Exception e) { + return false; + } + } + + public static void goToMail(Context context, String sendTo, @Nullable String title, @Nullable String content) { Uri uri = Uri.parse("mailto:" + sendTo); String[] email = {sendTo}; diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor920/Editor920Activity.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor920/Editor920Activity.java index c8e464ab..0ecbecac 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor920/Editor920Activity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor920/Editor920Activity.java @@ -1,8 +1,11 @@ package com.stardust.scriptdroid.ui.edit.editor920; +import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import com.afollestad.materialdialogs.folderselector.FolderChooserDialog; +import com.jecelyin.editor.v2.Pref; import com.jecelyin.editor.v2.common.Command; import com.jecelyin.editor.v2.ui.IActivity; import com.jecelyin.editor.v2.ui.TabManager; @@ -13,6 +16,13 @@ import java.io.File; * Created by Stardust on 2017/1/30. */ public class Editor920Activity extends IActivity { + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Pref.getInstance(this).setReadOnly(false); + } + @Override public void startPickPathActivity(String s, String s1) { @@ -28,15 +38,11 @@ public class Editor920Activity extends IActivity { } - @Override - public void onDocumentChanged(int i) { - - } - @Override public void doCommand(Command command) { } + @Override public void openFile(String s, String s1, int i) { @@ -59,6 +65,16 @@ public class Editor920Activity extends IActivity { doCommand(c); } + @Override + public String getCurrentLang() { + return null; + } + + @Override + public void onDocumentChanged(int i) { + + } + @Override public void onFolderSelection(@NonNull FolderChooserDialog dialog, @NonNull File folder) { diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java index 65e6f48f..272bdff6 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java @@ -26,7 +26,6 @@ import com.afollestad.materialdialogs.folderselector.FileChooserDialog; import com.stardust.app.NotRemindAgainDialog; import com.stardust.scriptdroid.BuildConfig; import com.stardust.scriptdroid.R; -import com.stardust.scriptdroid.droid.runtime.action.ActionPerformAccessibilityDelegate; import com.stardust.scriptdroid.droid.script.file.ScriptFile; import com.stardust.scriptdroid.droid.script.file.ScriptFileList; import com.stardust.scriptdroid.droid.script.file.SharedPrefScriptFileList; @@ -80,7 +79,7 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File } private void goToAccessibilityPermissionSettingIfDisabled() { - if (!AccessibilityServiceUtils.isAccessibilityServiceEnabled(this, ActionPerformAccessibilityDelegate.class)) { + if (!AccessibilityServiceUtils.isAccessibilityServiceEnabled(this, AccessibilityWatchDogService.class)) { new NotRemindAgainDialog.Builder(this, "goToAccessibilityPermissionSettingIfDisabled") .title(R.string.text_alert) .content(R.string.explain_accessibility_permission) diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperationPopupMenu.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperationPopupMenu.java index 95d8ec53..ee611010 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperationPopupMenu.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/operation/ScriptFileOperationPopupMenu.java @@ -1,11 +1,15 @@ package com.stardust.scriptdroid.ui.main.operation; +import android.app.Activity; import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.support.annotation.Nullable; +import android.support.v4.widget.PopupWindowCompat; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; +import android.util.DisplayMetrics; +import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -54,7 +58,27 @@ public class ScriptFileOperationPopupMenu extends PopupWindow { } public void show(View anchor) { - super.showAsDropDown(anchor, 0, -anchor.getWidth()); + int y = (int) (getScreenHeight() - anchor.getHeight() - getYInScreen(anchor) - getContentHeight()); + y = Math.min(y, -anchor.getHeight()); + PopupWindowCompat.showAsDropDown(this, anchor, 0, y, Gravity.LEFT | Gravity.BOTTOM); + } + + private int getContentHeight() { + getContentView().measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); + return getContentView().getMeasuredHeight(); + } + + private int getYInScreen(View anchor) { + int[] location = new int[2]; + anchor.getLocationInWindow(location); + return location[1]; + } + + + private float getScreenHeight() { + DisplayMetrics displaymetrics = new DisplayMetrics(); + ((Activity) mContext).getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); + return displaymetrics.heightPixels; } private void init() { diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/settings/AboutActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/settings/AboutActivity.java index abee66e3..a0a1d4e4 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/settings/AboutActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/settings/AboutActivity.java @@ -68,9 +68,10 @@ public class AboutActivity extends BaseActivity { @ViewBinding.Click(R.id.qq) private void openQQToChatWithMe() { - Toast.makeText(this, R.string.text_qq_group_id_copied, Toast.LENGTH_SHORT).show(); String qq = getString(R.string.qq); - IntentTool.goToQQ(this, qq); + if (!IntentTool.goToQQ(this, qq)) { + Toast.makeText(this, R.string.text_mobile_qq_not_installed, Toast.LENGTH_SHORT).show(); + } } @ViewBinding.Click(R.id.email) diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/settings/SettingsActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/settings/SettingsActivity.java index 6d48b335..199419b0 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/settings/SettingsActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/settings/SettingsActivity.java @@ -1,7 +1,5 @@ package com.stardust.scriptdroid.ui.settings; -import android.content.ClipData; -import android.content.ClipboardManager; import android.content.Intent; import android.os.Bundle; import android.preference.Preference; @@ -13,6 +11,7 @@ import android.widget.Toast; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.file.SampleFileManager; +import com.stardust.scriptdroid.tool.IntentTool; import com.stardust.scriptdroid.ui.BaseActivity; import com.stardust.scriptdroid.ui.error.IssueReportActivity; import com.stardust.scriptdroid.ui.main.MainActivity; @@ -89,8 +88,9 @@ public class SettingsActivity extends BaseActivity { .entry(getString(R.string.text_join_qq_group), new Runnable() { @Override public void run() { - ((ClipboardManager) getActivity().getSystemService(CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("qq", "556928653")); - Toast.makeText(getActivity(), R.string.text_qq_group_id_copied, Toast.LENGTH_SHORT).show(); + if (!IntentTool.joinQQGroup(getActivity(), "vjHXzZlpGcXNe-YEWzQ85mm_z8y-curC")) { + Toast.makeText(getActivity(), R.string.text_mobile_qq_not_installed, Toast.LENGTH_SHORT).show(); + } } }) .entry(getString(R.string.text_about), new Runnable() { diff --git a/app/src/main/res/layout/activity_about_items.xml b/app/src/main/res/layout/activity_about_items.xml index 38125a3e..b53e94b0 100644 --- a/app/src/main/res/layout/activity_about_items.xml +++ b/app/src/main/res/layout/activity_about_items.xml @@ -14,13 +14,12 @@ android:background="?selectableItemBackground" android:clickable="true" android:gravity="center_vertical" - android:orientation="horizontal" - android:padding="16dp"> + android:orientation="horizontal"> + android:orientation="horizontal"> + android:orientation="horizontal"> + android:orientation="horizontal"> + android:orientation="horizontal"> https://github.com/HeinrichReimer/android-issue-reporter Apache Software License 2.0 + + LeakCanary + Copyright 2015 Square, Inc. + https://github.com/square/leakcanary + Apache Software License 2.0 + \ 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 1c63239c..5d775ee9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -117,4 +117,8 @@ 已复制群号到剪贴板 关闭 重新录制 + 使用音量键控制 + 开启后每次音量变化会开始或停止脚本录制 + key_use_volume_control_record + 未安装手机QQ diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 3090281e..070cb148 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -1,6 +1,16 @@ + + + + +