diff --git a/app/build.gradle b/app/build.gradle index 2451864d..29cc33e8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,9 +7,9 @@ android { buildToolsVersion "25.0.2" defaultConfig { applicationId "com.stardust.scriptdroid" - minSdkVersion 19 + minSdkVersion 17 targetSdkVersion 23 - versionCode 142 + versionCode 143 versionName "2.0.13 Beta2" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true @@ -118,7 +118,7 @@ dependencies { compile 'com.yqritc:recyclerview-flexibledivider:1.4.0' compile 'com.ashokvarma.android:bottom-navigation-bar:2.0.1' // Tasker Plugin - compile group: 'com.twofortyfouram', name: 'android-plugin-client-sdk-for-locale', version: '[4.0.2, 5.0[' + compile 'com.twofortyfouram:android-plugin-client-sdk-for-locale:[4.0.2, 5.0[' compile 'com.android.volley:volley:1.0.0' compile 'com.flurry.android:analytics:7.0.0@aar' compile 'com.pushtorefresh.storio:sqlite:1.12.3' @@ -134,4 +134,5 @@ dependencies { compile project(':automator') compile project(':common') compile project(':autojs') + compile files('libs/GDTUnionSDK.4.9.545.min.jar') } \ No newline at end of file diff --git a/app/libs/GDTUnionSDK.4.9.545.min.jar b/app/libs/GDTUnionSDK.4.9.545.min.jar new file mode 100644 index 00000000..6fd58f48 Binary files /dev/null and b/app/libs/GDTUnionSDK.4.9.545.min.jar differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7fd65ad3..c5eb4e22 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,10 +9,11 @@ - - + + + + + + + + + + + - - - - + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/stardust/scriptdroid/Constants.java b/app/src/main/java/com/stardust/scriptdroid/Constants.java new file mode 100644 index 00000000..37416f50 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/Constants.java @@ -0,0 +1,10 @@ +package com.stardust.scriptdroid; + +/** + * Created by Stardust on 2017/7/7. + */ + +public final class Constants { + public static final String APP_ID = "1105513627"; + public static final String SPLASH_POS_ID = "3050728349211259"; +} diff --git a/app/src/main/java/com/stardust/scriptdroid/Pref.java b/app/src/main/java/com/stardust/scriptdroid/Pref.java index 7ac1de80..ec102dff 100644 --- a/app/src/main/java/com/stardust/scriptdroid/Pref.java +++ b/app/src/main/java/com/stardust/scriptdroid/Pref.java @@ -11,6 +11,8 @@ import com.stardust.scriptdroid.autojs.AutoJs; import org.mozilla.javascript.tools.debugger.Dim; import org.mozilla.javascript.tools.debugger.GuiCallback; +import java.util.concurrent.TimeUnit; + /** * Created by Stardust on 2017/1/31. */ @@ -19,6 +21,8 @@ public class Pref { private static final SharedPreferences DISPOSABLE_BOOLEAN = App.getApp().getSharedPreferences("DISPOSABLE_BOOLEAN", Context.MODE_PRIVATE); private static final String KEY_SERVER_ADDRESS = "Still love you...17.5.14"; private static final String KEY_SHOULD_SHOW_ANNUNCIATION = "Sing about all the things you forgot, things you are not"; + private static final String KEY_FIRST_SHOW_AD = "En, Today is 17.7.7, but, I'm still love you so...."; + private static final String KEY_LAST_SHOW_AD_MILLIS = "But... it seems that...you will not come back any more..."; private static SharedPreferences.OnSharedPreferenceChangeListener onSharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { @@ -129,4 +133,26 @@ public class Pref { public static boolean shouldShowAnnunciation() { return getDisposableBoolean(KEY_SHOULD_SHOW_ANNUNCIATION, true); } + + public static boolean shouldShowAd() { + String adShowingMode = def().getString(getString(R.string.key_ad_showing_mode), "Default"); + switch (adShowingMode) { + case "Default": + return true; + case "OncePerDay": + long lastShowMillis = def().getLong(KEY_LAST_SHOW_AD_MILLIS, 0); + if (System.currentTimeMillis() - lastShowMillis < TimeUnit.DAYS.toMillis(1)) { + return false; + } + def().edit().putLong(KEY_LAST_SHOW_AD_MILLIS, System.currentTimeMillis()).apply(); + return true; + case "Off": + return false; + } + return true; + } + + public static boolean isFirstShowingAd() { + return getDisposableBoolean(KEY_FIRST_SHOW_AD, true); + } } diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/FloatingWindowManger.java b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/FloatingWindowManger.java deleted file mode 100644 index b791c937..00000000 --- a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/FloatingWindowManger.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.stardust.scriptdroid.external.floatingwindow; - -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.Build; -import android.preference.PreferenceManager; -import android.provider.Settings; -import android.support.annotation.RequiresApi; -import android.util.Log; -import android.widget.Toast; - -import com.stardust.scriptdroid.App; -import com.stardust.scriptdroid.R; -import com.stardust.scriptdroid.external.floatingwindow.menu.HoverMenuService; -import com.stardust.util.IntentUtil; - -/** - * Created by Stardust on 2017/3/10. - */ - -public class FloatingWindowManger { - - private static final String KEY_FLOATING_WINDOW_PERMISSION = "May we go back..I...miss..you..Eating..17.5.9"; - private static final String TAG = "FloatingWindowManger"; - - public static void showHoverMenu() { - if (!HoverMenuService.isServiceRunning()) { - if (!hasFloatingWindowPermission(App.getApp())) { - Toast.makeText(App.getApp(), R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show(); - goToFloatingWindowPermissionSetting(); - } else { - HoverMenuService.startService(App.getApp()); - } - } - } - - public static void goToFloatingWindowPermissionSetting() { - IntentUtil.goToAppDetailSettings(App.getApp()); - } - - @RequiresApi(api = Build.VERSION_CODES.M) - private static void goToOverlayPermissionSettings(Context context, String packageName) { - try { - App.getApp().startActivity(new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, - Uri.parse("package:" + context)) - .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); - } catch (Exception e) { - IntentUtil.goToAppDetailSettings(App.getApp()); - } - } - - public static void checkPermission() { - final OverlayPermissionChecker checker = new OverlayPermissionChecker(App.getApp()); - checker.setCallback(new OverlayPermissionChecker.Callback() { - @Override - public void onCheckResult(boolean granted) { - checker.setCallback(null); - Log.d(TAG, "onCheckResult:" + granted); - setHasFloatingWindowPermission(App.getApp(), granted); - } - }); - checker.check(1500); - } - - public static boolean hasFloatingWindowPermission(Context context) { - return hasOverlayPermission(); - } - - private static void setHasFloatingWindowPermission(Context context, boolean has) { - PreferenceManager.getDefaultSharedPreferences(context).edit().putBoolean(KEY_FLOATING_WINDOW_PERMISSION, has).apply(); - } - - private static boolean hasOverlayPermission() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - return Settings.canDrawOverlays(App.getApp()); - } - return true; - } - - public static boolean isHoverMenuShowing() { - return HoverMenuService.isServiceRunning(); - } - - - public static void hideHoverMenu() { - if (HoverMenuService.isServiceRunning()) - App.getApp().stopService(new Intent(App.getApp(), HoverMenuService.class)); - } -} diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/HoverMenuManger.java b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/HoverMenuManger.java new file mode 100644 index 00000000..6d1bcf54 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/HoverMenuManger.java @@ -0,0 +1,48 @@ +package com.stardust.scriptdroid.external.floatingwindow; + +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.os.Build; +import android.preference.PreferenceManager; +import android.provider.Settings; +import android.support.annotation.RequiresApi; +import android.util.Log; +import android.widget.Toast; + +import com.stardust.scriptdroid.App; +import com.stardust.scriptdroid.R; +import com.stardust.scriptdroid.external.floatingwindow.menu.HoverMenuService; +import com.stardust.util.IntentUtil; + +import ezy.assist.compat.SettingsCompat; + +/** + * Created by Stardust on 2017/3/10. + */ + +public class HoverMenuManger { + + private static final String KEY_FLOATING_WINDOW_PERMISSION = "May we go back..I...miss..you..Eating..17.5.9"; + private static final String TAG = "HoverMenuManger"; + + public static void showHoverMenu() { + if (!HoverMenuService.isServiceRunning()) { + if (!SettingsCompat.canDrawOverlays(App.getApp())) { + Toast.makeText(App.getApp(), R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show(); + SettingsCompat.manageDrawOverlays(App.getApp()); + } else { + HoverMenuService.startService(App.getApp()); + } + } + } + + public static boolean isHoverMenuShowing() { + return HoverMenuService.isServiceRunning(); + } + + + public static void hideHoverMenu() { + App.getApp().stopService(new Intent(App.getApp(), HoverMenuService.class)); + } +} diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/OverlayPermissionChecker.java b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/OverlayPermissionChecker.java deleted file mode 100644 index 39c149b0..00000000 --- a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/OverlayPermissionChecker.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.stardust.scriptdroid.external.floatingwindow; - -import android.content.Context; -import android.content.Intent; -import android.graphics.Canvas; -import android.graphics.Color; -import android.graphics.PixelFormat; -import android.os.Handler; -import android.view.Gravity; -import android.view.View; -import android.view.WindowManager; - -import com.stardust.enhancedfloaty.FloatyService; -import com.stardust.enhancedfloaty.FloatyWindow; - -/** - * Created by Stardust on 2017/5/9. - */ - -public class OverlayPermissionChecker { - - public interface Callback { - void onCheckResult(boolean granted); - } - - private OnePixelWindow mOnePixelWindow = new OnePixelWindow(); - private Callback mCallback; - private Context mContext; - private Handler mHandler; - private Boolean mCheckResult = null; - - public OverlayPermissionChecker(Context context) { - mContext = context; - mHandler = new Handler(context.getMainLooper()); - } - - public void check() { - mCheckResult = null; - try { - FloatyService.addWindow(mOnePixelWindow); - mContext.startService(new Intent(mContext, FloatyService.class)); - } catch (WindowManager.BadTokenException e) { - onCheckResult(false); - } - } - - public void check(int timeOut) { - check(); - mHandler.postDelayed(new Runnable() { - @Override - public void run() { - if (mCheckResult == null) { - onCheckResult(false); - } - } - }, timeOut); - } - - public void setCallback(Callback callback) { - mCallback = callback; - } - - private void onCheckResult(boolean b) { - mCheckResult = b; - if (mCallback != null) { - mCallback.onCheckResult(b); - } - } - - - private class OnePixelWindow implements FloatyWindow { - - private View mOnePixelView; - private WindowManager mWindowManager; - - @Override - public void onCreate(FloatyService floatyService, WindowManager windowManager) { - mWindowManager = windowManager; - mOnePixelView = new View(floatyService) { - @Override - protected void onDraw(Canvas canvas) { - super.onDraw(canvas); - notifyWindowVisible(); - } - - @Override - protected void onWindowVisibilityChanged(int visibility) { - super.onWindowVisibilityChanged(visibility); - } - }; - mOnePixelView.setWillNotDraw(false); - mOnePixelView.setBackgroundColor(Color.RED); - WindowManager.LayoutParams params = new WindowManager.LayoutParams(10, 10, - WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE, - PixelFormat.TRANSLUCENT); - params.gravity = Gravity.TOP | Gravity.START; - windowManager.addView(mOnePixelView, params); - } - - private void notifyWindowVisible() { - onCheckResult(true); - //close(); - } - - @Override - public void onServiceDestroy(FloatyService floatyService) { - close(); - } - - @Override - public void close() { - mWindowManager.removeView(mOnePixelView); - FloatyService.removeWindow(this); - } - } - -} diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/HoverMenuService.java b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/HoverMenuService.java index 213e1a60..aa265fcb 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/HoverMenuService.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/HoverMenuService.java @@ -17,7 +17,6 @@ import com.stardust.hover.SimpleHoverMenuTransitionListener; import com.stardust.hover.WindowHoverMenu; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.autojs.AutoJs; -import com.stardust.scriptdroid.external.floatingwindow.FloatingWindowManger; import com.stardust.scriptdroid.external.floatingwindow.menu.layout_inspector.NodeInfo; import com.stardust.scriptdroid.external.floatingwindow.menu.view.FloatingLayoutBoundsView; import com.stardust.scriptdroid.external.floatingwindow.menu.view.FloatingLayoutHierarchyView; @@ -29,6 +28,7 @@ import com.stardust.util.MessageIntent; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; +import ezy.assist.compat.SettingsCompat; import io.mattcarroll.hover.HoverMenu; import io.mattcarroll.hover.defaulthovermenu.window.WindowViewController; @@ -129,7 +129,7 @@ public class HoverMenuService extends Service { } catch (Exception e) { e.printStackTrace(); Toast.makeText(this, R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show(); - FloatingWindowManger.goToFloatingWindowPermissionSetting(); + SettingsCompat.manageDrawOverlays(this); } } diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/MainMenuNavigatorContent.java b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/MainMenuNavigatorContent.java index a74c8373..f688682d 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/MainMenuNavigatorContent.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/MainMenuNavigatorContent.java @@ -13,6 +13,7 @@ import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.autojs.AutoJs; import com.stardust.scriptdroid.external.floatingwindow.menu.HoverMenuService; import com.stardust.scriptdroid.external.floatingwindow.menu.layout_inspector.LayoutInspector; +import com.stardust.scriptdroid.tool.AccessibilityServiceTool; import com.stardust.scriptdroid.ui.main.MainActivity_; import com.stardust.util.ClipboardUtil; import com.stardust.util.MessageEvent; @@ -87,6 +88,12 @@ public class MainMenuNavigatorContent implements NavigatorContent { HoverMenuService.postIntent(new Intent(HoverMenuService.ACTION_COLLAPSE_MENU)); } + @OnClick(R.id.open_accessibility_settings) + void openAccessibilitySettings() { + AccessibilityServiceTool.enableAccessibilityService(); + HoverMenuService.postIntent(new Intent(HoverMenuService.ACTION_COLLAPSE_MENU)); + } + @NonNull @Override public View getView() { diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/ScriptListNavigatorContent.java b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/ScriptListNavigatorContent.java index a8f8f049..618d3ebf 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/ScriptListNavigatorContent.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/ScriptListNavigatorContent.java @@ -7,6 +7,7 @@ import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.view.WindowManager; import android.workground.WrapContentLinearLayoutManager; import com.stardust.scriptdroid.R; @@ -14,6 +15,7 @@ import com.stardust.scriptdroid.external.floatingwindow.menu.HoverMenuService; import com.stardust.scriptdroid.script.ScriptFile; import com.stardust.scriptdroid.script.Scripts; import com.stardust.scriptdroid.script.StorageScriptProvider; +import com.stardust.scriptdroid.ui.common.ScriptLoopDialog; import com.stardust.scriptdroid.ui.edit.EditActivity; import com.stardust.scriptdroid.ui.main.script_list.ScriptAndFolderListRecyclerView; import com.stardust.scriptdroid.ui.main.script_list.ScriptListWithProgressBarView; @@ -88,18 +90,33 @@ public class ScriptListNavigatorContent implements NavigatorContent { private class FileViewHolder extends DirectoryViewHolder { - FileViewHolder(View itemView) { + FileViewHolder(final View itemView) { super(itemView); itemView.findViewById(R.id.edit).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - int position = mFloatingScriptFileListView.getChildViewHolder((View) v.getParent()).getAdapterPosition(); - ScriptFile file = mFloatingScriptFileListView.getAdapter().getScriptFileAt(position); - EditActivity.editFile(v.getContext(), file); + EditActivity.editFile(v.getContext(), getScriptFile()); HoverMenuService.postIntent(new Intent(HoverMenuService.ACTION_COLLAPSE_MENU)); } }); + itemView.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + new ScriptLoopDialog(v.getContext(), getScriptFile()) + .windowType(WindowManager.LayoutParams.TYPE_PHONE) + .show(); + HoverMenuService.postIntent(new Intent(HoverMenuService.ACTION_COLLAPSE_MENU)); + return true; + } + }); + } + + private ScriptFile getScriptFile() { + return mFloatingScriptFileListView.getAdapter().getScriptFileAt(getAdapterPosition()); } + } + + } \ No newline at end of file diff --git a/app/src/main/java/com/stardust/scriptdroid/script/Scripts.java b/app/src/main/java/com/stardust/scriptdroid/script/Scripts.java index c1b19e14..7f2a2173 100644 --- a/app/src/main/java/com/stardust/scriptdroid/script/Scripts.java +++ b/app/src/main/java/com/stardust/scriptdroid/script/Scripts.java @@ -111,4 +111,12 @@ public class Scripts { return AutoJs.getInstance().getScriptEngineService().execute(source, BROADCAST_SENDER_SCRIPT_EXECUTION_LISTENER, new ExecutionConfig().requirePath(StorageScriptProvider.DEFAULT_DIRECTORY_PATH)); } + + public static ScriptExecution runRepeatedly(ScriptFile scriptFile, int loopTimes, long delay, long interval) { + ScriptSource source = new FileScriptSource(scriptFile); + String directoryPath = scriptFile.getParent(); + return AutoJs.getInstance().getScriptEngineService().execute(source, new ExecutionConfig() + .requirePath(directoryPath, StorageScriptProvider.DEFAULT_DIRECTORY_PATH) + .loop(delay, loopTimes, interval)); + } } diff --git a/app/src/main/java/com/stardust/scriptdroid/sublime/SublimePluginClient.java b/app/src/main/java/com/stardust/scriptdroid/sublime/SublimePluginClient.java index a24768bd..1a6a28e8 100644 --- a/app/src/main/java/com/stardust/scriptdroid/sublime/SublimePluginClient.java +++ b/app/src/main/java/com/stardust/scriptdroid/sublime/SublimePluginClient.java @@ -76,7 +76,7 @@ public class SublimePluginClient { private void tryClose() { try { close(); - } catch (IOException e) { + } catch (Exception e) { e.printStackTrace(); } } diff --git a/app/src/main/java/com/stardust/scriptdroid/sublime/SublimeResponseHandler.java b/app/src/main/java/com/stardust/scriptdroid/sublime/SublimeResponseHandler.java index 7179aaed..6d514df2 100644 --- a/app/src/main/java/com/stardust/scriptdroid/sublime/SublimeResponseHandler.java +++ b/app/src/main/java/com/stardust/scriptdroid/sublime/SublimeResponseHandler.java @@ -9,8 +9,11 @@ import com.google.gson.JsonObject; import com.stardust.autojs.execution.ScriptExecution; import com.stardust.autojs.script.StringScriptSource; import com.stardust.pio.PFile; +import com.stardust.scriptdroid.App; +import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.autojs.AutoJs; import com.stardust.scriptdroid.script.Scripts; +import com.stardust.scriptdroid.script.StorageScriptProvider; /** * Created by Stardust on 2017/5/11. @@ -39,6 +42,15 @@ public class SublimeResponseHandler implements Handler { return true; } }) + .handler("save", new Handler() { + @Override + public boolean handle(JsonObject data) { + String script = data.get("script").getAsString(); + String name = getName(data); + saveScript(name, script); + return false; + } + }) .handler("rerun", new Handler() { @Override @@ -91,4 +103,18 @@ public class SublimeResponseHandler implements Handler { } return element.getAsString(); } + + private void saveScript(String name, String script) { + if (TextUtils.isEmpty(name)) { + name = "untitled"; + } + name = PFile.getNameWithoutExtension(name); + if (!name.endsWith(".js")) { + name = "" + name + ".js"; + } else { + name = "" + name; + } + PFile.write(StorageScriptProvider.DEFAULT_DIRECTORY_PATH + name, script); + App.getApp().getUiHandler().toast(R.string.text_script_save_successfully); + } } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/common/ScriptLoopDialog.java b/app/src/main/java/com/stardust/scriptdroid/ui/common/ScriptLoopDialog.java new file mode 100644 index 00000000..191c41b9 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/ui/common/ScriptLoopDialog.java @@ -0,0 +1,79 @@ +package com.stardust.scriptdroid.ui.common; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.design.widget.TextInputEditText; +import android.view.View; +import android.view.Window; +import android.widget.Toast; + +import com.afollestad.materialdialogs.DialogAction; +import com.afollestad.materialdialogs.MaterialDialog; +import com.stardust.scriptdroid.App; +import com.stardust.scriptdroid.R; +import com.stardust.scriptdroid.script.ScriptFile; +import com.stardust.scriptdroid.script.Scripts; + +import butterknife.BindView; +import butterknife.ButterKnife; + +/** + * Created by Stardust on 2017/7/8. + */ + +public class ScriptLoopDialog { + + private ScriptFile mScriptFile; + private MaterialDialog mDialog; + + @BindView(R.id.loop_times) + TextInputEditText mLoopTimes; + + @BindView(R.id.loop_interval) + TextInputEditText mLoopInterval; + + @BindView(R.id.loop_delay) + TextInputEditText mLoopDelay; + + + public ScriptLoopDialog(Context context, ScriptFile file) { + mScriptFile = file; + View view = View.inflate(context, R.layout.dialog_script_loop, null); + mDialog = new MaterialDialog.Builder(context) + .title(R.string.text_run_repeatedly) + .customView(view, true) + .positiveText(R.string.ok) + .onPositive(new MaterialDialog.SingleButtonCallback() { + @Override + public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { + startScriptRunningLoop(); + } + }) + .build(); + ButterKnife.bind(this, view); + } + + private void startScriptRunningLoop() { + try { + int loopTimes = Integer.parseInt(mLoopTimes.getText().toString()); + float loopInterval = Float.parseFloat(mLoopInterval.getText().toString()); + float loopDelay = Float.parseFloat(mLoopDelay.getText().toString()); + Scripts.runRepeatedly(mScriptFile, loopTimes, (long) (1000L * loopDelay), (long) (loopInterval * 1000L)); + } catch (NumberFormatException e) { + App.getApp().getUiHandler().toast(R.string.text_number_format_error); + } + } + + public ScriptLoopDialog windowType(int windowType) { + Window window = mDialog.getWindow(); + if (window != null) { + window.setType(windowType); + } + return this; + } + + public void show() { + mDialog.show(); + } + +} 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 221619cc..a627887f 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 @@ -34,7 +34,7 @@ import com.stardust.scriptdroid.BuildConfig; import com.stardust.scriptdroid.Pref; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.autojs.AutoJs; -import com.stardust.scriptdroid.external.floatingwindow.FloatingWindowManger; +import com.stardust.scriptdroid.external.floatingwindow.HoverMenuManger; import com.stardust.scriptdroid.script.ScriptFile; import com.stardust.scriptdroid.script.StorageScriptProvider; import com.stardust.scriptdroid.script.sample.Sample; @@ -46,7 +46,6 @@ import com.stardust.scriptdroid.ui.BaseActivity; import com.stardust.scriptdroid.ui.main.sample_list.SampleScriptListFragment; import com.stardust.scriptdroid.ui.main.script_list.MyScriptListFragment; import com.stardust.scriptdroid.ui.main.script_list.ScriptFileChooserDialogBuilder; -import com.stardust.scriptdroid.ui.main.task.TaskManagerFragment; import com.stardust.scriptdroid.ui.settings.SettingsActivity_; import com.stardust.scriptdroid.ui.update.VersionGuard; import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder; @@ -275,7 +274,7 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega @Click(R.id.exit) public void exitCompletely() { - FloatingWindowManger.hideHoverMenu(); + HoverMenuManger.hideHoverMenu(); stopService(new Intent(this, FloatyService.class)); AutoJs.getInstance().getScriptEngineService().stopAll(); finish(); diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/SideMenuFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/SideMenuFragment.java index fcb5599e..967091e4 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/SideMenuFragment.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/SideMenuFragment.java @@ -15,7 +15,7 @@ import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.Pref; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.autojs.AutoJs; -import com.stardust.scriptdroid.external.floatingwindow.FloatingWindowManger; +import com.stardust.scriptdroid.external.floatingwindow.HoverMenuManger; import com.stardust.scriptdroid.external.floatingwindow.menu.HoverMenuService; import com.stardust.view.accessibility.AccessibilityService; import com.stardust.scriptdroid.sublime.SublimePluginClient; @@ -50,7 +50,7 @@ public class SideMenuFragment extends android.support.v4.app.Fragment { activity.getSupportFragmentManager().beginTransaction().replace(viewId, fragment).commit(); } - @ViewById(R.id.sw_auto_operate_service) + @ViewById(R.id.sw_accessibility_service) SwitchCompat mAccessibilityServiceSwitch; @ViewById(R.id.sw_floating_window) SwitchCompat mFloatingWindowSwitch; @@ -89,7 +89,7 @@ public class SideMenuFragment extends android.support.v4.app.Fragment { }); } }, 450); - mFloatingWindowSwitch.setChecked(FloatingWindowManger.isHoverMenuShowing()); + mFloatingWindowSwitch.setChecked(HoverMenuManger.isHoverMenuShowing()); } @@ -108,7 +108,7 @@ public class SideMenuFragment extends android.support.v4.app.Fragment { mAccessibilityServiceSwitch.toggle(); } - @CheckedChange(R.id.sw_auto_operate_service) + @CheckedChange(R.id.sw_accessibility_service) void setAutoOperateServiceEnable(CompoundButton button, boolean enable) { boolean isAccessibilityServiceEnabled = AccessibilityService.isEnabled(App.getApp()); if (enable && !isAccessibilityServiceEnabled) { @@ -122,10 +122,10 @@ public class SideMenuFragment extends android.support.v4.app.Fragment { @CheckedChange(R.id.sw_floating_window) void setFloatingWindowEnable(CompoundButton button, boolean enable) { - if (enable && !FloatingWindowManger.isHoverMenuShowing()) { - FloatingWindowManger.showHoverMenu(); - } else if (!enable && FloatingWindowManger.isHoverMenuShowing()) { - FloatingWindowManger.hideHoverMenu(); + if (enable && !HoverMenuManger.isHoverMenuShowing()) { + HoverMenuManger.showHoverMenu(); + } else if (!enable && HoverMenuManger.isHoverMenuShowing()) { + HoverMenuManger.hideHoverMenu(); } } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/MyScriptListFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/MyScriptListFragment.java index f2e2eddf..aef226f0 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/MyScriptListFragment.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/script_list/MyScriptListFragment.java @@ -20,6 +20,7 @@ import com.stardust.pio.PFile; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.script.Scripts; import com.stardust.scriptdroid.script.StorageScriptProvider; +import com.stardust.scriptdroid.ui.common.ScriptLoopDialog; import com.stardust.scriptdroid.ui.edit.EditActivity; import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder; import com.stardust.util.UnderuseExecutors; @@ -106,6 +107,7 @@ public class MyScriptListFragment extends Fragment { private void initDialogs() { mScriptFileOperationDialog = new OperationDialogBuilder(getContext()) + .item(R.id.loop, R.drawable.ic_loop_white_24dp, R.string.text_run_repeatedly) .item(R.id.rename, R.drawable.ic_ali_rename, R.string.text_rename) .item(R.id.open_by_other_apps, R.drawable.ic_ali_open, R.string.text_open_by_other_apps) .item(R.id.create_shortcut, R.drawable.ic_ali_shortcut, R.string.text_send_shortcut) @@ -228,6 +230,14 @@ public class MyScriptListFragment extends Fragment { }); } + @Optional + @OnClick(R.id.loop) + void runScriptRepeatedly() { + dismissDialogs(); + new ScriptLoopDialog(getActivity(), mSelectedScriptFile) + .show(); + } + @Optional @OnClick(R.id.rename) void renameScriptFile() { 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 777668ca..bd86ad45 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 @@ -15,6 +15,8 @@ import com.stardust.scriptdroid.tool.UpdateChecker; import com.stardust.scriptdroid.ui.BaseActivity; import com.stardust.scriptdroid.ui.error.IssueReporterActivity; import com.stardust.scriptdroid.ui.main.MainActivity; +import com.stardust.scriptdroid.ui.splash.SplashActivity; +import com.stardust.scriptdroid.ui.splash.SplashActivity_; import com.stardust.scriptdroid.ui.update.UpdateCheckDialog; import com.stardust.util.IntentUtil; import com.stardust.util.MapEntries; @@ -114,6 +116,15 @@ public class SettingsActivity extends BaseActivity { Toast.makeText(getActivity(), R.string.text_already_reset, Toast.LENGTH_SHORT).show(); } }) + .entry(getString(R.string.show_ad), new Runnable() { + @Override + public void run() { + SplashActivity_.intent(getActivity()) + .extra(SplashActivity.NOT_START_MAIN_ACTIVITY, true) + .extra(SplashActivity.FORCE_SHOW_AD, true) + .start(); + } + }) .entry(getString(R.string.text_check_update), new Runnable() { @Override public void run() { diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/splash/SplashActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/splash/SplashActivity.java new file mode 100644 index 00000000..2ebb6a1b --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/ui/splash/SplashActivity.java @@ -0,0 +1,135 @@ +package com.stardust.scriptdroid.ui.splash; + +import android.Manifest; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.util.Log; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import com.qq.e.ads.splash.SplashAD; +import com.qq.e.ads.splash.SplashADListener; +import com.stardust.scriptdroid.Constants; +import com.stardust.scriptdroid.Pref; +import com.stardust.scriptdroid.R; +import com.stardust.scriptdroid.ui.BaseActivity; +import com.stardust.scriptdroid.ui.main.MainActivity_; + +import org.androidannotations.annotations.AfterViews; +import org.androidannotations.annotations.EActivity; +import org.androidannotations.annotations.ViewById; + +import java.util.Locale; + +/** + * Created by Stardust on 2017/7/7. + */ +@EActivity(R.layout.activity_splash) +public class SplashActivity extends BaseActivity { + + public static final String NOT_START_MAIN_ACTIVITY = "Eating...I...really...love...you..."; + public static final String FORCE_SHOW_AD = "I will be better but can you take just a glance at me..."; + + private static final String LOG_TAG = SplashActivity.class.getSimpleName(); + + @ViewById(R.id.logo) + ImageView mLogo; + + @ViewById(R.id.skip_view) + TextView mSkipView; + + @ViewById(R.id.ad_container) + View mAdContainer; + + @ViewById(R.id.ad) + FrameLayout mAd; + + private SplashAD mSplashAD; + private boolean mCanEnterNextActivity = false; + private boolean mNotStartMainActivity; + + @Override + protected void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mNotStartMainActivity = getIntent().getBooleanExtra(NOT_START_MAIN_ACTIVITY, false); + boolean forceShowAd = getIntent().getBooleanExtra(FORCE_SHOW_AD, false); + if (!forceShowAd && !Pref.shouldShowAd()) { + enterNextActivity(); + return; + } + checkPermission(Manifest.permission.READ_PHONE_STATE, Manifest.permission.WRITE_EXTERNAL_STORAGE); + } + + @AfterViews + void setUpViews() { + fetchSplashAD(); + } + + void enterNextActivity() { + if (!mNotStartMainActivity) + MainActivity_.intent(this).start(); + finish(); + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + } + + @Override + protected void onResume() { + super.onResume(); + enterNextActivityIfNeeded(); + } + + @Override + protected void onPause() { + super.onPause(); + mCanEnterNextActivity = false; + } + + private void enterNextActivityIfNeeded() { + if (mCanEnterNextActivity) { + enterNextActivity(); + return; + } + mCanEnterNextActivity = true; + } + + private void fetchSplashAD() { + mSplashAD = new SplashAD(this, mAd, mSkipView, Constants.APP_ID, Constants.SPLASH_POS_ID, new SplashADListener() { + @Override + public void onADDismissed() { + Log.v(LOG_TAG, "onADDismissed"); + enterNextActivityIfNeeded(); + } + + @Override + public void onNoAD(int errno) { + Log.e(LOG_TAG, "onNoAD: " + errno); + enterNextActivity(); + } + + @Override + public void onADPresent() { + Log.v(LOG_TAG, "onADPresent"); + mSkipView.setVisibility(View.VISIBLE); + } + + @Override + public void onADClicked() { + Log.v(LOG_TAG, "onADClicked"); + } + + @Override + public void onADTick(long l) { + mSkipView.setText(String.format(Locale.getDefault(), getString(R.string.format_skip), Math.round(l / 1000f))); + } + }, 0); + } +} diff --git a/app/src/main/res/drawable-hdpi/ic_loop_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_loop_white_24dp.png new file mode 100644 index 00000000..f0072e11 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_loop_white_24dp.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_loop_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_loop_white_24dp.png new file mode 100644 index 00000000..92cf0a71 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_loop_white_24dp.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_loop_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_loop_white_24dp.png new file mode 100644 index 00000000..7a7a771e Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_loop_white_24dp.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_loop_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_loop_white_24dp.png new file mode 100644 index 00000000..be061bfe Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_loop_white_24dp.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_loop_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_loop_white_24dp.png new file mode 100644 index 00000000..f8b12771 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_loop_white_24dp.png differ diff --git a/app/src/main/res/drawable/autojs.png b/app/src/main/res/drawable/autojs.png new file mode 100644 index 00000000..ec66e65e Binary files /dev/null and b/app/src/main/res/drawable/autojs.png differ diff --git a/app/src/main/res/drawable/skip_circle_bg.xml b/app/src/main/res/drawable/skip_circle_bg.xml new file mode 100644 index 00000000..57e57d7d --- /dev/null +++ b/app/src/main/res/drawable/skip_circle_bg.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_splash.xml b/app/src/main/res/layout/activity_splash.xml new file mode 100644 index 00000000..abd54e05 --- /dev/null +++ b/app/src/main/res/layout/activity_splash.xml @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_directory_operations.xml b/app/src/main/res/layout/dialog_directory_operations.xml deleted file mode 100644 index 7b847e1d..00000000 --- a/app/src/main/res/layout/dialog_directory_operations.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_script_file_operations.xml b/app/src/main/res/layout/dialog_script_file_operations.xml deleted file mode 100644 index 8dd7d651..00000000 --- a/app/src/main/res/layout/dialog_script_file_operations.xml +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_script_loop.xml b/app/src/main/res/layout/dialog_script_loop.xml new file mode 100644 index 00000000..adbae78e --- /dev/null +++ b/app/src/main/res/layout/dialog_script_loop.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/floating_window_main_menu.xml b/app/src/main/res/layout/floating_window_main_menu.xml index f44114c9..652a849b 100644 --- a/app/src/main/res/layout/floating_window_main_menu.xml +++ b/app/src/main/res/layout/floating_window_main_menu.xml @@ -1,95 +1,117 @@ - + - + android:orientation="vertical"> - + - + - + - + - + - + - + - + - + - + - - \ No newline at end of file + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/floating_window_record.xml b/app/src/main/res/layout/floating_window_record.xml index 731981cf..957bcba4 100644 --- a/app/src/main/res/layout/floating_window_record.xml +++ b/app/src/main/res/layout/floating_window_record.xml @@ -1,151 +1,158 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + - - + android:orientation="vertical"> + android:textSize="20sp"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_edit_side_menu.xml b/app/src/main/res/layout/fragment_edit_side_menu.xml deleted file mode 100644 index 47971f4a..00000000 --- a/app/src/main/res/layout/fragment_edit_side_menu.xml +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_side_menu.xml b/app/src/main/res/layout/fragment_side_menu.xml index e90d3b9f..106c7edb 100644 --- a/app/src/main/res/layout/fragment_side_menu.xml +++ b/app/src/main/res/layout/fragment_side_menu.xml @@ -1,174 +1,181 @@ - + + android:layout_height="wrap_content" + android:orientation="vertical"> - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index bc3563c0..4b9fc3eb 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -8,4 +8,6 @@ -4dp 56dp 0dp + 56dp + 0dp diff --git a/app/src/main/res/values/ids.xml b/app/src/main/res/values/ids.xml new file mode 100644 index 00000000..10c31a9c --- /dev/null +++ b/app/src/main/res/values/ids.xml @@ -0,0 +1,8 @@ + + + + + + + + \ 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 73d3ea7b..f587aa81 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -190,6 +190,22 @@ 在布局范围中查看 更多 分享 + 跳过 %d + 广告可以在设置中关闭 + key_ad_showing_mode + 广告 + 欣赏广告 + 广告显示设置 + Default + 保存成功,请刷新目录 + 循环运行 + 循环间隔(秒) + 延迟执行(秒) + 循环次数 + 0为无限循环 + 延迟多少秒后开始循环 + 格式错误 + 打开无障碍服务 @@ -205,4 +221,16 @@ KEY_CAMERA + + 默认 + 每天显示一次 + 不显示 + + + + Default + OncePerDay + Off + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 1594db63..d74580ff 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -14,12 +14,10 @@ false -