Add: Volume Changing to stop scripts, Fix: Automator ANR
This commit is contained in:
@@ -43,6 +43,11 @@ public class Pref {
|
||||
return def().getBoolean(getString(R.string.key_use_volume_control_record), false);
|
||||
}
|
||||
|
||||
public static boolean isRunningVolumeControlEnable() {
|
||||
return def().getBoolean(getString(R.string.key_use_volume_control_running), false);
|
||||
}
|
||||
|
||||
|
||||
private static String getString(int id) {
|
||||
return App.getApp().getString(id);
|
||||
}
|
||||
@@ -58,4 +63,5 @@ public class Pref {
|
||||
public static boolean isFirstUsing() {
|
||||
return getDisposableBoolean("isFirstUsing", true);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,16 +1,20 @@
|
||||
package com.stardust.scriptdroid.droid;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.support.annotation.NonNull;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.jraska.console.timber.ConsoleTree;
|
||||
import com.stardust.scriptdroid.App;
|
||||
import com.stardust.scriptdroid.Pref;
|
||||
import com.stardust.scriptdroid.R;
|
||||
import com.stardust.scriptdroid.droid.runtime.DroidRuntime;
|
||||
import com.stardust.scriptdroid.droid.runtime.ScriptStopException;
|
||||
import com.stardust.scriptdroid.droid.script.JavaScriptEngine;
|
||||
import com.stardust.scriptdroid.droid.script.RhinoJavaScriptEngine;
|
||||
import com.stardust.scriptdroid.droid.script.ScriptExecuteActivity;
|
||||
import com.stardust.scriptdroid.service.VolumeChangeObverseService;
|
||||
import com.stardust.scriptdroid.tool.FileUtils;
|
||||
|
||||
import java.io.File;
|
||||
@@ -32,6 +36,8 @@ public class Droid {
|
||||
|
||||
public static final String UI = "\"ui\";";
|
||||
|
||||
public static final String AUTO = "\"auto\";";
|
||||
|
||||
public interface OnRunFinishedListener extends Serializable {
|
||||
void onRunFinished(Object result);
|
||||
|
||||
@@ -63,8 +69,18 @@ public class Droid {
|
||||
}
|
||||
};
|
||||
private static Droid instance = new Droid();
|
||||
private VolumeChangeObverseService.OnVolumeChangeListener mOnVolumeChangeListener = new VolumeChangeObverseService.OnVolumeChangeListener() {
|
||||
@Override
|
||||
public void onVolumeChange() {
|
||||
if (Pref.isRunningVolumeControlEnable()) {
|
||||
stopAllAndToast();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
private Droid() {
|
||||
VolumeChangeObverseService.addOnVolumeChangeListener(mOnVolumeChangeListener);
|
||||
}
|
||||
|
||||
public static Droid getInstance() {
|
||||
@@ -107,6 +123,7 @@ public class Droid {
|
||||
}
|
||||
|
||||
public void runScript(final String script, OnRunFinishedListener listener, RunningConfig config) {
|
||||
App.getApp().startService(new Intent(App.getApp(), VolumeChangeObverseService.class));
|
||||
listener = listener == null ? DEFAULT_LISTENER : listener;
|
||||
if (config.runInNewThread) {
|
||||
if (script.startsWith(UI)) {
|
||||
@@ -125,6 +142,15 @@ public class Droid {
|
||||
return JAVA_SCRIPT_ENGINE.stopAll();
|
||||
}
|
||||
|
||||
|
||||
public void stopAllAndToast() {
|
||||
int n = stopAll();
|
||||
if (n > 0)
|
||||
RUNTIME.toast(String.format(App.getResString(R.string.text_already_stop_n_scripts), n));
|
||||
else
|
||||
RUNTIME.toast(App.getResString(R.string.text_no_running_script));
|
||||
}
|
||||
|
||||
private void checkFile(File file) {
|
||||
if (file == null) {
|
||||
throw new NullPointerException("file = null");
|
||||
@@ -151,6 +177,8 @@ public class Droid {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
if (mScript.startsWith(AUTO))
|
||||
DroidRuntime.getRuntime().ensureAccessibilityServiceEnable();
|
||||
mOnRunFinishedListener.onRunFinished(JAVA_SCRIPT_ENGINE.execute(mScript));
|
||||
} catch (Exception e) {
|
||||
mOnRunFinishedListener.onException(e);
|
||||
|
||||
@@ -26,6 +26,7 @@ import com.stardust.scriptdroid.accessibility.AccessibilityInfoProvider;
|
||||
import com.stardust.scriptdroid.droid.runtime.action.ActionTarget;
|
||||
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
|
||||
import com.stardust.scriptdroid.service.AccessibilityWatchDogService;
|
||||
import com.stardust.scriptdroid.tool.IntentTool;
|
||||
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
|
||||
import com.jraska.console.Console;
|
||||
import com.stardust.scriptdroid.App;
|
||||
@@ -77,28 +78,34 @@ public class DroidRuntime {
|
||||
mUIHandler = new Handler(App.getApp().getMainLooper());
|
||||
}
|
||||
|
||||
public void launchPackage(String packageName) {
|
||||
PackageManager packageManager = App.getApp().getPackageManager();
|
||||
App.getApp().startActivity(packageManager.getLaunchIntentForPackage(packageName));
|
||||
public boolean launchPackage(String packageName) {
|
||||
try {
|
||||
PackageManager packageManager = App.getApp().getPackageManager();
|
||||
App.getApp().startActivity(packageManager.getLaunchIntentForPackage(packageName));
|
||||
return true;
|
||||
} catch (Exception e) {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void launch(String packageName, String className) {
|
||||
App.getApp().startActivity(new Intent().setClassName(packageName, className).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
||||
public boolean launchApp(String appName) {
|
||||
return launchPackage(getPackageName(appName));
|
||||
}
|
||||
|
||||
public void launchApp(String appName) {
|
||||
public String getPackageName(String appName) {
|
||||
PackageManager packageManager = App.getApp().getPackageManager();
|
||||
List<ApplicationInfo> installedApplications = packageManager.getInstalledApplications(PackageManager.GET_META_DATA);
|
||||
for (ApplicationInfo applicationInfo : installedApplications) {
|
||||
if (packageManager.getApplicationLabel(applicationInfo).toString().equals(appName)) {
|
||||
launchPackage(applicationInfo.packageName);
|
||||
break;
|
||||
return applicationInfo.processName;
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
public String[] getPackageName(String appName) {
|
||||
return new String[0];
|
||||
public boolean openAppSetting(String packageName){
|
||||
return IntentTool.goToAppSetting(App.getApp(), packageName);
|
||||
}
|
||||
|
||||
public ActionTarget text(String text, int i) {
|
||||
|
||||
@@ -9,7 +9,7 @@ import android.view.accessibility.AccessibilityNodeInfo;
|
||||
public abstract class Action {
|
||||
|
||||
private boolean mPerformUtilSucceed = false;
|
||||
private Object mResult;
|
||||
private volatile Object mResult = false;
|
||||
|
||||
public Action(boolean performUtilSucceed) {
|
||||
mPerformUtilSucceed = performUtilSucceed;
|
||||
|
||||
@@ -12,6 +12,9 @@ import com.stardust.scriptdroid.App;
|
||||
import com.stardust.scriptdroid.droid.runtime.DroidRuntime;
|
||||
import com.stardust.view.accessibility.AccessibilityDelegate;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
|
||||
/**
|
||||
* Created by Stardust on 2017/1/21.
|
||||
@@ -27,12 +30,14 @@ public class ActionPerformAccessibilityDelegate implements AccessibilityDelegate
|
||||
|
||||
private static Action action;
|
||||
|
||||
private Executor mExecutor = Executors.newFixedThreadPool(5);
|
||||
|
||||
public static void setAction(Action action) {
|
||||
synchronized (ACTION_LOCK) {
|
||||
ActionPerformAccessibilityDelegate.action = action;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onAccessibilityEvent(AccessibilityService service, AccessibilityEvent event) {
|
||||
synchronized (ACTION_LOCK) {
|
||||
@@ -43,18 +48,27 @@ public class ActionPerformAccessibilityDelegate implements AccessibilityDelegate
|
||||
Log.v(TAG, "root = null");
|
||||
return false;
|
||||
}
|
||||
Log.i(TAG, "perform action:" + action);
|
||||
if (action.perform(root)) {
|
||||
action.setResult(true);
|
||||
onActionPerformed();
|
||||
} else if (!action.performUtilSucceed()) {
|
||||
action.setResult(false);
|
||||
onActionPerformed();
|
||||
}
|
||||
performAction(root, action);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private void performAction(final AccessibilityNodeInfo root, final Action action) {
|
||||
mExecutor.execute(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
Log.i(TAG, "perform action:" + action);
|
||||
if (action.perform(root)) {
|
||||
action.setResult(true);
|
||||
onActionPerformed();
|
||||
} else if (!action.performUtilSucceed()) {
|
||||
action.setResult(false);
|
||||
onActionPerformed();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
private void onActionPerformed() {
|
||||
synchronized (ACTION_LOCK) {
|
||||
|
||||
@@ -9,6 +9,7 @@ import android.view.View;
|
||||
import com.stardust.scriptdroid.App;
|
||||
import com.stardust.scriptdroid.R;
|
||||
import com.stardust.scriptdroid.layout_inspector.view.LayoutInspectView;
|
||||
import com.stardust.scriptdroid.tool.IntentTool;
|
||||
import com.stardust.view.Floaty;
|
||||
import com.stardust.view.ResizableFloaty;
|
||||
|
||||
@@ -30,16 +31,17 @@ public class FloatingWindowManger {
|
||||
|
||||
public static void goToFloatingWindowPermissionSetting() {
|
||||
String packageName = App.getApp().getPackageName();
|
||||
Intent intent;
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||
intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
|
||||
Uri.parse("package:" + packageName))
|
||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
try {
|
||||
App.getApp().startActivity(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
|
||||
Uri.parse("package:" + packageName))
|
||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
||||
} catch (Exception e) {
|
||||
IntentTool.goToAppSetting(App.getApp());
|
||||
}
|
||||
} else {
|
||||
intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + packageName))
|
||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
IntentTool.goToAppSetting(App.getApp());
|
||||
}
|
||||
App.getApp().startActivity(intent);
|
||||
}
|
||||
|
||||
private static boolean hasFloatingWindowPermission() {
|
||||
@@ -56,6 +58,6 @@ public class FloatingWindowManger {
|
||||
|
||||
public static void hideFloatingWindow() {
|
||||
if (HoverMenuService.isServiceRunning())
|
||||
HoverMenuService.stopService();
|
||||
App.getApp().stopService(new Intent(App.getApp(), HoverMenuService.class));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,7 +54,6 @@ public class HoverMenuService extends Service {
|
||||
public static final String MESSAGE_MENU_EXPANDING = "MESSAGE_MENU_EXPANDING";
|
||||
public static final String MESSAGE_MENU_EXIT = "MESSAGE_MENU_EXIT";
|
||||
|
||||
private static HoverMenuService service = null;
|
||||
private static boolean sIsRunning;
|
||||
|
||||
public static void startService(Context context) {
|
||||
@@ -66,13 +65,6 @@ public class HoverMenuService extends Service {
|
||||
return sIsRunning;
|
||||
}
|
||||
|
||||
public static void stopService() {
|
||||
if (isServiceRunning() && service != null) {
|
||||
service.stopSelf();
|
||||
setIsRunning(false);
|
||||
}
|
||||
}
|
||||
|
||||
private static void setIsRunning(boolean isRunning) {
|
||||
sIsRunning = isRunning;
|
||||
EventBus.getDefault().post(new ServiceStateChangedEvent(sIsRunning));
|
||||
@@ -105,20 +97,18 @@ public class HoverMenuService extends Service {
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
if (service != null) {
|
||||
stopSelf();
|
||||
return;
|
||||
}
|
||||
service = this;
|
||||
EventBus.getDefault().register(this);
|
||||
mPrefs = getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE);
|
||||
tryInitViews();
|
||||
}
|
||||
|
||||
private void tryInitViews() {
|
||||
try {
|
||||
initViews();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
Toast.makeText(this, R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show();
|
||||
FloatingWindowManger.goToFloatingWindowPermissionSetting();
|
||||
stopService();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -171,6 +161,8 @@ public class HoverMenuService extends Service {
|
||||
|
||||
@Override
|
||||
public int onStartCommand(Intent intent, int flags, int startId) {
|
||||
if (mWindowHoverMenu == null)
|
||||
tryInitViews();
|
||||
if (mWindowHoverMenu != null)
|
||||
mWindowHoverMenu.show();
|
||||
return START_STICKY;
|
||||
@@ -183,8 +175,6 @@ public class HoverMenuService extends Service {
|
||||
if (EventBus.getDefault().isRegistered(this))
|
||||
EventBus.getDefault().unregister(this);
|
||||
setIsRunning(false);
|
||||
if (service == this)
|
||||
service = null;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -78,11 +78,7 @@ public class MainMenuNavigatorContent implements NavigatorContent {
|
||||
|
||||
@ViewBinding.Click(R.id.stop_all_running_scripts)
|
||||
private void stopAllRunningScripts() {
|
||||
int n = Droid.getInstance().stopAll();
|
||||
if (n > 0)
|
||||
Toast.makeText(mView.getContext(), String.format(mView.getContext().getString(R.string.text_already_stop_n_scripts), n), Toast.LENGTH_SHORT).show();
|
||||
else
|
||||
Toast.makeText(mView.getContext(), R.string.text_no_running_script, Toast.LENGTH_SHORT).show();
|
||||
Droid.getInstance().stopAllAndToast();
|
||||
}
|
||||
|
||||
@ViewBinding.Click(R.id.open_launcher)
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
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;
|
||||
@@ -8,6 +9,8 @@ import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import com.stardust.scriptdroid.App;
|
||||
import com.stardust.scriptdroid.Pref;
|
||||
import com.stardust.scriptdroid.R;
|
||||
import com.stardust.scriptdroid.accessibility.AccessibilityEventHelper;
|
||||
import com.stardust.scriptdroid.external.floating_window.HoverMenuService;
|
||||
@@ -15,6 +18,7 @@ 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;
|
||||
@@ -53,10 +57,26 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat
|
||||
private Recorder mRecorder;
|
||||
private Context mContext;
|
||||
|
||||
private VolumeChangeObverseService.OnVolumeChangeListener mOnVolumeChangeListener = new VolumeChangeObverseService.OnVolumeChangeListener() {
|
||||
@Override
|
||||
public void onVolumeChange() {
|
||||
if (Pref.isRecordVolumeControlEnable()) {
|
||||
if (mRecorder == null) {
|
||||
startRecord();
|
||||
} else if (mRecorder.getState() == Recorder.STATE_RECORDING) {
|
||||
stopRecord();
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public RecordNavigatorContent(Context context) {
|
||||
mContext = context;
|
||||
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);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@@ -67,16 +87,12 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat
|
||||
|
||||
@Override
|
||||
public void onShown(@NonNull Navigator navigator) {
|
||||
if (!EventBus.getDefault().isRegistered(this)) {
|
||||
EventBus.getDefault().register(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onHidden() {
|
||||
if (EventBus.getDefault().isRegistered(this)) {
|
||||
EventBus.getDefault().unregister(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ViewBinding.Click(R.id.sw_root_container)
|
||||
@@ -145,6 +161,9 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat
|
||||
public void onMessageEvent(MessageEvent event) {
|
||||
if (event.message.equals(HoverMenuService.MESSAGE_MENU_EXPANDING)) {
|
||||
pauseRecord();
|
||||
} else if (event.message.equals(HoverMenuService.MESSAGE_MENU_EXIT)) {
|
||||
EventBus.getDefault().unregister(this);
|
||||
VolumeChangeObverseService.removeOnVolumeChangeListener(mOnVolumeChangeListener);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -49,7 +49,6 @@ public class AccessibilityActionRecordNotification {
|
||||
case ACTION_DELETE:
|
||||
AccessibilityActionRecordNotification.cancelNotification();
|
||||
stopRecordIfNeeded(context);
|
||||
VolumeChangeObverseService.stopServiceIfNeeded();
|
||||
break;
|
||||
case ACTION_REDO:
|
||||
redoRecord(context);
|
||||
@@ -93,7 +92,7 @@ public class AccessibilityActionRecordNotification {
|
||||
.setCustomContentView(AccessibilityActionRecordSwitchView.getInstance());
|
||||
}
|
||||
showNotification(builder.build());
|
||||
VolumeChangeObverseService.startServiceIfNeeded(App.getApp());
|
||||
App.getApp().startService(new Intent(App.getApp(), VolumeChangeObverseService.class));
|
||||
}
|
||||
|
||||
private static void showNotification(Notification notification) {
|
||||
|
||||
@@ -4,6 +4,7 @@ import android.content.Context;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
@@ -50,8 +51,11 @@ public class LayoutHierarchyView extends MultiLevelListView {
|
||||
private Paint mPaint;
|
||||
private int mStatusBarHeight;
|
||||
private NodeInfo mClickedNodeInfo;
|
||||
private View mClickedView;
|
||||
private Drawable mOriginalBackground;
|
||||
|
||||
private boolean mShowClickedNodeBounds;
|
||||
private int mClickedColor = 0x77c4c4c4;
|
||||
|
||||
public LayoutHierarchyView(Context context) {
|
||||
super(context);
|
||||
@@ -72,6 +76,11 @@ public class LayoutHierarchyView extends MultiLevelListView {
|
||||
mShowClickedNodeBounds = showClickedNodeBounds;
|
||||
}
|
||||
|
||||
public void setClickedColor(int clickedColor) {
|
||||
mClickedColor = clickedColor;
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void init() {
|
||||
mAdapter = new Adapter();
|
||||
@@ -83,18 +92,28 @@ public class LayoutHierarchyView extends MultiLevelListView {
|
||||
setOnItemClickListener(new OnItemClickListener() {
|
||||
@Override
|
||||
public void onItemClicked(MultiLevelListView parent, View view, Object item, ItemInfo itemInfo) {
|
||||
mClickedNodeInfo = (NodeInfo) item;
|
||||
invalidate();
|
||||
setClickedItem(view, (NodeInfo) item);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onGroupItemClicked(MultiLevelListView parent, View view, Object item, ItemInfo itemInfo) {
|
||||
mClickedNodeInfo = (NodeInfo) item;
|
||||
invalidate();
|
||||
setClickedItem(view, (NodeInfo) item);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void setClickedItem(View view, NodeInfo item) {
|
||||
mClickedNodeInfo = item;
|
||||
if (mClickedView == null) {
|
||||
mOriginalBackground = view.getBackground();
|
||||
} else {
|
||||
mClickedView.setBackground(mOriginalBackground);
|
||||
}
|
||||
view.setBackgroundColor(mClickedColor);
|
||||
mClickedView = view;
|
||||
invalidate();
|
||||
}
|
||||
|
||||
private void initPaint() {
|
||||
mPaint = new Paint();
|
||||
mPaint.setColor(Color.DKGRAY);
|
||||
|
||||
@@ -14,6 +14,8 @@ 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;
|
||||
|
||||
|
||||
/**
|
||||
@@ -22,32 +24,27 @@ import java.lang.ref.WeakReference;
|
||||
|
||||
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;
|
||||
private static VolumeChangeObverseService instance;
|
||||
|
||||
public static void stopServiceIfNeeded() {
|
||||
if (instance != null) {
|
||||
instance.stopSelf();
|
||||
instance = null;
|
||||
}
|
||||
}
|
||||
|
||||
public static void startServiceIfNeeded(Context context) {
|
||||
if (Pref.isRecordVolumeControlEnable() && instance == null) {
|
||||
context.startService(new Intent(context, VolumeChangeObverseService.class));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
if (instance != null) {
|
||||
instance.stopSelf();
|
||||
}
|
||||
instance = this;
|
||||
mVolumeChangeReceiver = new VolumeChangeReceiver();
|
||||
registerReceiver(mVolumeChangeReceiver, new IntentFilter(ACTION_VOLUME_CHANGE));
|
||||
}
|
||||
@@ -61,7 +58,6 @@ public class VolumeChangeObverseService extends Service {
|
||||
@Override
|
||||
public void onDestroy() {
|
||||
super.onDestroy();
|
||||
instance = null;
|
||||
unregisterReceiver(mVolumeChangeReceiver);
|
||||
}
|
||||
|
||||
@@ -76,10 +72,8 @@ public class VolumeChangeObverseService extends Service {
|
||||
return;
|
||||
}
|
||||
mLastChangeMillis = System.currentTimeMillis();
|
||||
if (AccessibilityActionRecorder.getInstance().getState() == Recorder.STATE_STOPPED) {
|
||||
AccessibilityActionRecordNotification.startRecord(VolumeChangeObverseService.this);
|
||||
} else {
|
||||
AccessibilityActionRecordNotification.stopRecord(VolumeChangeObverseService.this);
|
||||
for (OnVolumeChangeListener listener : mOnVolumeChangeListenerList) {
|
||||
listener.onVolumeChange();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.stardust.scriptdroid.tool;
|
||||
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.Context;
|
||||
import android.widget.Toast;
|
||||
|
||||
@@ -32,7 +33,11 @@ public class AccessibilityServiceTool {
|
||||
if (Pref.isFirstGoToAccessibilitySetting()) {
|
||||
Toast.makeText(context, context.getString(R.string.text_please_choose) + context.getString(R.string._app_name), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
AccessibilityServiceUtils.goToAccessibilitySetting(context);
|
||||
try {
|
||||
AccessibilityServiceUtils.goToAccessibilitySetting(context);
|
||||
} catch (ActivityNotFoundException e) {
|
||||
Toast.makeText(context, context.getString(R.string.go_to_accessibility_settings) + context.getString(R.string._app_name), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean enableAccessibilityServiceByRootAndWaitFor(Class<AccessibilityWatchDogService> accessibilityService, int timeout) {
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
package com.stardust.scriptdroid.tool;
|
||||
|
||||
import android.content.ActivityNotFoundException;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.support.annotation.Nullable;
|
||||
|
||||
import com.stardust.scriptdroid.App;
|
||||
import com.stardust.scriptdroid.R;
|
||||
|
||||
/**
|
||||
@@ -70,4 +72,20 @@ public class IntentTool {
|
||||
.setType("text/plain"));
|
||||
}
|
||||
|
||||
public static boolean goToAppSetting(Context context, String packageName) {
|
||||
try {
|
||||
Intent i = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
|
||||
i.addCategory(Intent.CATEGORY_DEFAULT);
|
||||
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||
i.setData(Uri.parse("package:" + packageName));
|
||||
context.startActivity(i);
|
||||
return true;
|
||||
} catch (ActivityNotFoundException ignored) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean goToAppSetting(Context context) {
|
||||
return goToAppSetting(context, context.getPackageName());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -333,4 +333,13 @@ public class EditActivity extends Editor920Activity {
|
||||
unregisterReceiver(mOnRunFinishedReceiver);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onRestoreInstanceState(Bundle savedInstanceState) {
|
||||
try{
|
||||
super.onRestoreInstanceState(savedInstanceState);
|
||||
}catch (RuntimeException e){
|
||||
// FIXME: 2017/3/20
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,12 +50,14 @@ public class EditSideMenuFragment extends Fragment {
|
||||
return inflater.inflate(R.layout.fragment_edit_side_menu, container, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void afterCreateView() {
|
||||
setUpUI();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
if (mFloatingWindowSwitch == null) {
|
||||
setUpUI();
|
||||
}
|
||||
syncSwitchState();
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,6 @@ import java.lang.reflect.Method;
|
||||
|
||||
public class IssueReportActivity extends IssueReporterActivity {
|
||||
|
||||
|
||||
private boolean mCrash = false;
|
||||
private Method mReportIssue, mValidateInput;
|
||||
private boolean mReportFailed = false;
|
||||
|
||||
@@ -371,7 +371,8 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
|
||||
context.startActivity(intent);
|
||||
}
|
||||
|
||||
public void OnAppBarClick(View view) {
|
||||
@ViewBinding.Click(R.id.toolbar)
|
||||
public void OnToolbarClick() {
|
||||
new ImageSelector(this, mActivityResultIntermediary, new ImageSelector.ImageSelectorCallback() {
|
||||
@Override
|
||||
public void onImageSelected(ImageSelector selector, String path) {
|
||||
|
||||
@@ -52,13 +52,15 @@ public class SlideMenuFragment extends Fragment {
|
||||
return inflater.inflate(R.layout.fragment_slide_menu, container, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void afterCreateView() {
|
||||
setUpSwitchCompat();
|
||||
ViewBinder.bind(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
if (mAutoOperateServiceSwitch == null) {
|
||||
setUpSwitchCompat();
|
||||
ViewBinder.bind(this);
|
||||
}
|
||||
syncSwitchState();
|
||||
}
|
||||
|
||||
|
||||
@@ -43,16 +43,7 @@ public class MyScriptListFragment extends Fragment implements BackPressedHandler
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStart() {
|
||||
super.onStart();
|
||||
init();
|
||||
}
|
||||
|
||||
private void init() {
|
||||
setUpScriptList();
|
||||
}
|
||||
|
||||
private void setUpScriptList() {
|
||||
protected void afterCreateView() {
|
||||
mScriptListRecyclerView = $(R.id.script_list);
|
||||
mScriptFileList = ScriptFileList.getImpl();
|
||||
mNoScriptHint = $(R.id.hint_no_script);
|
||||
@@ -69,6 +60,14 @@ public class MyScriptListFragment extends Fragment implements BackPressedHandler
|
||||
mScriptListRecyclerView.setScriptFileList(mScriptFileList);
|
||||
}
|
||||
|
||||
private void init() {
|
||||
setUpScriptList();
|
||||
}
|
||||
|
||||
private void setUpScriptList() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean onBackPressed() {
|
||||
|
||||
@@ -8,6 +8,8 @@ import android.content.pm.PackageManager;
|
||||
import android.net.Uri;
|
||||
import android.widget.Toast;
|
||||
|
||||
import static com.stardust.scriptdroid.tool.IntentTool.goToAppSetting;
|
||||
|
||||
/**
|
||||
* Created by Stardust on 2017/3/10.
|
||||
*/
|
||||
@@ -17,23 +19,12 @@ public class FloatingWindowUtils {
|
||||
public static boolean checkFloatingWindowPermission(Context context, int messageResId) {
|
||||
if (!isFloatingWindowPermitted(context)) {
|
||||
Toast.makeText(context, messageResId, Toast.LENGTH_SHORT).show();
|
||||
goToAppSetting(context);
|
||||
goToAppSetting(context, context.getPackageName());
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private static void goToAppSetting(Context context) {
|
||||
try {
|
||||
Intent i = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
|
||||
i.addCategory(Intent.CATEGORY_DEFAULT);
|
||||
i.setData(Uri.parse("package:" + context.getPackageName()));
|
||||
context.startActivity(i);
|
||||
} catch (ActivityNotFoundException ignored) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isFloatingWindowPermitted(Context context) {
|
||||
PackageManager pm = context.getPackageManager();
|
||||
return pm.checkPermission(Manifest.permission.SYSTEM_ALERT_WINDOW, context.getPackageName())
|
||||
|
||||
Reference in New Issue
Block a user