Add: Volume Changing to stop scripts, Fix: Automator ANR

This commit is contained in:
hyb1996
2017-03-20 16:04:59 +08:00
parent c9927a3ce3
commit 1f05bcce98
47 changed files with 497 additions and 141 deletions

View File

@@ -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);
}
}

View File

@@ -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);

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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));
}
}

View File

@@ -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;
}

View File

@@ -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)

View File

@@ -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);
}
}

View File

@@ -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) {

View File

@@ -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);

View File

@@ -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();
}
}
}

View File

@@ -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) {

View File

@@ -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());
}
}

View File

@@ -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();
}
}
}

View File

@@ -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();
}

View File

@@ -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;

View File

@@ -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) {

View File

@@ -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();
}

View File

@@ -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() {

View File

@@ -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())