Add: commonjs support, Fix: editor auto line break
This commit is contained in:
@@ -8,8 +8,8 @@ android {
|
|||||||
applicationId "com.stardust.scriptdroid"
|
applicationId "com.stardust.scriptdroid"
|
||||||
minSdkVersion 19
|
minSdkVersion 19
|
||||||
targetSdkVersion 23
|
targetSdkVersion 23
|
||||||
versionCode 108
|
versionCode 109
|
||||||
versionName "2.0.5 Beta"
|
versionName "2.0.6 Alpha"
|
||||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
|
|
||||||
@@ -70,6 +70,8 @@ dependencies {
|
|||||||
compile 'io.mattcarroll.hover:hover:0.9.7'
|
compile 'io.mattcarroll.hover:hover:0.9.7'
|
||||||
compile 'org.greenrobot:eventbus:3.0.0'
|
compile 'org.greenrobot:eventbus:3.0.0'
|
||||||
compile 'com.bignerdranch.android:expandablerecyclerview:3.0.0-RC1'
|
compile 'com.bignerdranch.android:expandablerecyclerview:3.0.0-RC1'
|
||||||
|
compile 'com.github.0xFireball:Enlightened:v31'
|
||||||
|
compile 'com.ashokvarma.android:bottom-navigation-bar:1.4.1'
|
||||||
compile(name: 'libtermexec-release', ext: 'aar')
|
compile(name: 'libtermexec-release', ext: 'aar')
|
||||||
compile(name: 'emulatorview-release', ext: 'aar')
|
compile(name: 'emulatorview-release', ext: 'aar')
|
||||||
compile(name: 'term-debug', ext: 'aar')
|
compile(name: 'term-debug', ext: 'aar')
|
||||||
|
|||||||
@@ -72,6 +72,7 @@
|
|||||||
<activity android:name=".ui.console.ConsoleActivity"/>
|
<activity android:name=".ui.console.ConsoleActivity"/>
|
||||||
<activity android:name=".ui.error.ErrorReportActivity"/>
|
<activity android:name=".ui.error.ErrorReportActivity"/>
|
||||||
<activity android:name=".ui.help.LocalWebViewActivity"/>
|
<activity android:name=".ui.help.LocalWebViewActivity"/>
|
||||||
|
<activity android:name=".ui.edit.IridiumEditActivity"/>
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".ui.error.IssueReportActivity"
|
android:name=".ui.error.IssueReportActivity"
|
||||||
|
|||||||
3
app/src/main/assets/test.js
Normal file
3
app/src/main/assets/test.js
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
module.exports = function() {
|
||||||
|
java.lang.System.out.println('The CommonJS require function works!')
|
||||||
|
}
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
package com.stardust.app;
|
||||||
|
|
||||||
|
import android.support.v4.app.FragmentActivity;
|
||||||
|
import android.support.v4.app.FragmentManager;
|
||||||
|
import android.support.v4.app.FragmentPagerAdapter;
|
||||||
|
import android.support.v4.app.Fragment;
|
||||||
|
import android.util.SparseArray;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Stardust on 2017/3/24.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class FragmentPagerAdapterBuilder {
|
||||||
|
|
||||||
|
private List<Fragment> mFragments = new ArrayList<>();
|
||||||
|
private List<String> mTitles = new ArrayList<>();
|
||||||
|
private FragmentActivity mActivity;
|
||||||
|
|
||||||
|
public FragmentPagerAdapterBuilder(FragmentActivity activity) {
|
||||||
|
mActivity = activity;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FragmentPagerAdapterBuilder add(Fragment fragment, String title) {
|
||||||
|
mFragments.add(fragment);
|
||||||
|
mTitles.add(title);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public FragmentPagerAdapterBuilder add(Fragment fragment, int titleResId) {
|
||||||
|
return add(fragment, mActivity.getString(titleResId));
|
||||||
|
}
|
||||||
|
|
||||||
|
public StoredFragmentPagerAdapter build() {
|
||||||
|
return new StoredFragmentPagerAdapter(mActivity.getSupportFragmentManager()) {
|
||||||
|
@Override
|
||||||
|
public Fragment getItem(int position) {
|
||||||
|
return mFragments.get(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getCount() {
|
||||||
|
return mFragments.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CharSequence getPageTitle(int position) {
|
||||||
|
return mTitles.get(position);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract static class StoredFragmentPagerAdapter extends FragmentPagerAdapter {
|
||||||
|
|
||||||
|
private SparseArray<Fragment> mStoredFragments = new SparseArray<>();
|
||||||
|
|
||||||
|
public StoredFragmentPagerAdapter(FragmentManager fm) {
|
||||||
|
super(fm);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object instantiateItem(ViewGroup container, int position) {
|
||||||
|
Fragment fragment = (Fragment) super.instantiateItem(container, position);
|
||||||
|
mStoredFragments.put(position, fragment);
|
||||||
|
return fragment;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void destroyItem(ViewGroup container, int position, Object object) {
|
||||||
|
mStoredFragments.remove(position);
|
||||||
|
super.destroyItem(container, position, object);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Fragment getStoredFragment(int position) {
|
||||||
|
return mStoredFragments.get(position);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -16,9 +16,9 @@ import static com.jecelyin.common.utils.StringUtils.md5;
|
|||||||
* Created by Stardust on 2017/1/30.
|
* Created by Stardust on 2017/1/30.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class NotRemindAgainDialog extends MaterialDialog {
|
public class NotAskAgainDialog extends MaterialDialog {
|
||||||
|
|
||||||
protected NotRemindAgainDialog(Builder builder) {
|
protected NotAskAgainDialog(Builder builder) {
|
||||||
super(builder);
|
super(builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -289,7 +289,6 @@ public class DroidRuntime {
|
|||||||
|
|
||||||
public ThemeColorMaterialDialogBuilder dialog() {
|
public ThemeColorMaterialDialogBuilder dialog() {
|
||||||
if (App.currentActivity() == null) {
|
if (App.currentActivity() == null) {
|
||||||
Toast.makeText(App.getApp(), R.string.text_cannot_create_dialog_when_app_invisible, Toast.LENGTH_SHORT).show();
|
|
||||||
throw new ScriptStopException(App.getApp().getString(R.string.text_cannot_create_dialog_when_app_invisible));
|
throw new ScriptStopException(App.getApp().getString(R.string.text_cannot_create_dialog_when_app_invisible));
|
||||||
}
|
}
|
||||||
return new ThemeColorMaterialDialogBuilder(App.currentActivity()) {
|
return new ThemeColorMaterialDialogBuilder(App.currentActivity()) {
|
||||||
|
|||||||
@@ -1,17 +1,29 @@
|
|||||||
package com.stardust.scriptdroid.droid.script;
|
package com.stardust.scriptdroid.droid.script;
|
||||||
|
|
||||||
|
import android.net.Uri;
|
||||||
|
|
||||||
import com.stardust.scriptdroid.droid.Droid;
|
import com.stardust.scriptdroid.droid.Droid;
|
||||||
import com.stardust.scriptdroid.App;
|
import com.stardust.scriptdroid.App;
|
||||||
import com.stardust.scriptdroid.droid.runtime.DroidRuntime;
|
import com.stardust.scriptdroid.droid.runtime.DroidRuntime;
|
||||||
import com.stardust.scriptdroid.droid.runtime.ScriptStopException;
|
import com.stardust.scriptdroid.droid.runtime.ScriptStopException;
|
||||||
|
import com.stardust.scriptdroid.droid.script.file.ScriptFile;
|
||||||
|
|
||||||
import org.mozilla.javascript.Context;
|
import org.mozilla.javascript.Context;
|
||||||
import org.mozilla.javascript.ContextFactory;
|
import org.mozilla.javascript.ContextFactory;
|
||||||
import org.mozilla.javascript.ImporterTopLevel;
|
import org.mozilla.javascript.ImporterTopLevel;
|
||||||
import org.mozilla.javascript.Scriptable;
|
import org.mozilla.javascript.Scriptable;
|
||||||
import org.mozilla.javascript.ScriptableObject;
|
import org.mozilla.javascript.ScriptableObject;
|
||||||
|
import org.mozilla.javascript.commonjs.module.RequireBuilder;
|
||||||
|
import org.mozilla.javascript.commonjs.module.provider.SoftCachingModuleScriptProvider;
|
||||||
|
import org.mozilla.javascript.commonjs.module.provider.UrlModuleSourceProvider;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@@ -63,11 +75,23 @@ public class RhinoJavaScriptEngine extends JavaScriptEngine {
|
|||||||
for (Map.Entry<String, Object> variable : mVariableMap.entrySet()) {
|
for (Map.Entry<String, Object> variable : mVariableMap.entrySet()) {
|
||||||
ScriptableObject.putProperty(scope, variable.getKey(), variable.getValue());
|
ScriptableObject.putProperty(scope, variable.getKey(), variable.getValue());
|
||||||
}
|
}
|
||||||
|
initRequireBuilder(context, scope);
|
||||||
context.evaluateString(scope, Init.getInitScript(), "<init>", 1, null);
|
context.evaluateString(scope, Init.getInitScript(), "<init>", 1, null);
|
||||||
mThreads.add(Thread.currentThread());
|
mThreads.add(Thread.currentThread());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void initRequireBuilder(Context context, Scriptable scope) {
|
||||||
|
List<URI> paths = Collections.singletonList(new File(ScriptFile.DEFAULT_FOLDER).toURI());
|
||||||
|
new RequireBuilder()
|
||||||
|
.setModuleScriptProvider(new SoftCachingModuleScriptProvider(
|
||||||
|
new UrlModuleSourceProvider(paths, null)))
|
||||||
|
.setSandboxed(true)
|
||||||
|
.createRequire(context, scope)
|
||||||
|
.install(scope);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int stopAll() {
|
public int stopAll() {
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ public abstract class ScriptFileList {
|
|||||||
public abstract int size();
|
public abstract int size();
|
||||||
|
|
||||||
public boolean deleteFromFileSystem(int i) {
|
public boolean deleteFromFileSystem(int i) {
|
||||||
|
if (i < 0 || i >= size())
|
||||||
|
return false;
|
||||||
File file = new File(get(i).path);
|
File file = new File(get(i).path);
|
||||||
remove(i);
|
remove(i);
|
||||||
return file.delete();
|
return file.delete();
|
||||||
|
|||||||
@@ -129,7 +129,6 @@ public class RecordNavigatorContent implements NavigatorContent, Recorder.OnStat
|
|||||||
|
|
||||||
private void startRecord() {
|
private void startRecord() {
|
||||||
mRecorder = mRecordedByRootSwitch.isChecked() ? new TouchRecorder() : AccessibilityActionRecorder.getInstance();
|
mRecorder = mRecordedByRootSwitch.isChecked() ? new TouchRecorder() : AccessibilityActionRecorder.getInstance();
|
||||||
AccessibilityActionRecorder.getInstance().setRecordMessageEnabled(mRecordToastSwitch.isChecked());
|
|
||||||
mRecorder.setOnStateChangedListener(this);
|
mRecorder.setOnStateChangedListener(this);
|
||||||
mRecorder.start();
|
mRecorder.start();
|
||||||
setState(Recorder.STATE_RECORDING);
|
setState(Recorder.STATE_RECORDING);
|
||||||
|
|||||||
@@ -1,170 +0,0 @@
|
|||||||
package com.stardust.scriptdroid.external.notification.record;
|
|
||||||
|
|
||||||
import android.app.Notification;
|
|
||||||
import android.app.NotificationManager;
|
|
||||||
import android.app.PendingIntent;
|
|
||||||
import android.content.BroadcastReceiver;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.IntentFilter;
|
|
||||||
import android.support.v4.app.NotificationCompat;
|
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import com.stardust.scriptdroid.App;
|
|
||||||
import com.stardust.scriptdroid.R;
|
|
||||||
import com.stardust.scriptdroid.record.Recorder;
|
|
||||||
import com.stardust.scriptdroid.record.accessibility.AccessibilityActionRecorder;
|
|
||||||
import com.stardust.scriptdroid.service.AccessibilityWatchDogService;
|
|
||||||
import com.stardust.scriptdroid.service.VolumeChangeObverseService;
|
|
||||||
import com.stardust.scriptdroid.ui.main.MainActivity;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Stardust on 2017/2/14.
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class AccessibilityActionRecordNotification {
|
|
||||||
|
|
||||||
private static final String INTENT_ACTION = " com.stardust.scriptdroid.Record";
|
|
||||||
private static final String EXTRA_ACTION = "action";
|
|
||||||
private static final int ACTION_STOP = 17771;
|
|
||||||
private static final int ACTION_START_OR_PAUSE = 17772;
|
|
||||||
private static final int ACTION_DELETE = 17773;
|
|
||||||
private static final int ACTION_REDO = 17774;
|
|
||||||
|
|
||||||
private static final int NOTIFY_ID = 22236;
|
|
||||||
private static NotificationCompat.Builder builder;
|
|
||||||
private static BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
|
|
||||||
@Override
|
|
||||||
public void onReceive(Context context, Intent intent) {
|
|
||||||
int action = intent.getIntExtra(EXTRA_ACTION, 0);
|
|
||||||
switch (action) {
|
|
||||||
case ACTION_STOP:
|
|
||||||
stopRecord(context);
|
|
||||||
collapseNotificationBar(context);
|
|
||||||
break;
|
|
||||||
case ACTION_START_OR_PAUSE:
|
|
||||||
startOrPauseRecord(context);
|
|
||||||
collapseNotificationBar(context);
|
|
||||||
break;
|
|
||||||
case ACTION_DELETE:
|
|
||||||
AccessibilityActionRecordNotification.cancelNotification();
|
|
||||||
stopRecordIfNeeded(context);
|
|
||||||
break;
|
|
||||||
case ACTION_REDO:
|
|
||||||
redoRecord(context);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static PendingIntent getStartOrPauseIntent() {
|
|
||||||
Intent intent = new Intent(INTENT_ACTION)
|
|
||||||
.putExtra(EXTRA_ACTION, ACTION_START_OR_PAUSE);
|
|
||||||
return PendingIntent.getBroadcast(App.getApp(), ACTION_START_OR_PAUSE, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
|
||||||
}
|
|
||||||
|
|
||||||
static PendingIntent getStopIntent() {
|
|
||||||
Intent intent = new Intent(INTENT_ACTION)
|
|
||||||
.putExtra(EXTRA_ACTION, ACTION_STOP);
|
|
||||||
return PendingIntent.getBroadcast(App.getApp(), ACTION_STOP, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
|
||||||
}
|
|
||||||
|
|
||||||
static PendingIntent getDeleteIntent() {
|
|
||||||
Intent intent = new Intent(INTENT_ACTION)
|
|
||||||
.putExtra(EXTRA_ACTION, ACTION_DELETE);
|
|
||||||
return PendingIntent.getBroadcast(App.getApp(), ACTION_DELETE, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static PendingIntent getRedoIntent() {
|
|
||||||
Intent intent = new Intent(INTENT_ACTION)
|
|
||||||
.putExtra(EXTRA_ACTION, ACTION_REDO);
|
|
||||||
return PendingIntent.getService(App.getApp(), ACTION_REDO, intent, PendingIntent.FLAG_UPDATE_CURRENT);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void showOrUpdateNotification() {
|
|
||||||
if (builder == null) {
|
|
||||||
builder = new NotificationCompat.Builder(App.getApp())
|
|
||||||
.setAutoCancel(false)
|
|
||||||
.setSmallIcon(R.drawable.ic_robot_head)
|
|
||||||
.setDeleteIntent(getDeleteIntent())
|
|
||||||
.setCustomContentView(AccessibilityActionRecordSwitchView.getInstance());
|
|
||||||
}
|
|
||||||
showNotification(builder.build());
|
|
||||||
App.getApp().startService(new Intent(App.getApp(), VolumeChangeObverseService.class));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void showNotification(Notification notification) {
|
|
||||||
NotificationManager notificationManager = (NotificationManager) App.getApp().getSystemService(Context.NOTIFICATION_SERVICE);
|
|
||||||
notificationManager.notify(NOTIFY_ID, notification);
|
|
||||||
App.getApp().registerReceiver(broadcastReceiver, new IntentFilter(INTENT_ACTION));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void cancelNotification() {
|
|
||||||
NotificationManager notificationManager = (NotificationManager) App.getApp().getSystemService(Context.NOTIFICATION_SERVICE);
|
|
||||||
notificationManager.cancel(NOTIFY_ID);
|
|
||||||
App.getApp().unregisterReceiver(broadcastReceiver);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void collapseNotificationBar(Context context) {
|
|
||||||
context.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void stopRecordIfNeeded(Context context) {
|
|
||||||
int state = AccessibilityActionRecorder.getInstance().getState();
|
|
||||||
if (state == Recorder.STATE_RECORDING || state == Recorder.STATE_PAUSED) {
|
|
||||||
stopRecord(context);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void startOrPauseRecord(Context context) {
|
|
||||||
int state = AccessibilityActionRecorder.getInstance().getState();
|
|
||||||
if (state == Recorder.STATE_PAUSED) {
|
|
||||||
resumeRecord(context);
|
|
||||||
} else if (state == Recorder.STATE_RECORDING) {
|
|
||||||
pauseRecord(context);
|
|
||||||
} else {
|
|
||||||
//state == STOPPED
|
|
||||||
startRecord(context);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void startRecord(Context context) {
|
|
||||||
if (AccessibilityWatchDogService.getInstance() == null) {
|
|
||||||
Toast.makeText(context, R.string.text_need_enable_accessibility_service_to_record, Toast.LENGTH_SHORT).show();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
AccessibilityActionRecorder.getInstance().start();
|
|
||||||
AccessibilityActionRecordSwitchView.getInstance().setState(Recorder.STATE_RECORDING);
|
|
||||||
Toast.makeText(context, R.string.text_start_record, Toast.LENGTH_SHORT).show();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void pauseRecord(Context context) {
|
|
||||||
AccessibilityActionRecorder.getInstance().pause();
|
|
||||||
AccessibilityActionRecordSwitchView.getInstance().setState(Recorder.STATE_PAUSED);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void resumeRecord(Context context) {
|
|
||||||
AccessibilityActionRecorder.getInstance().resume();
|
|
||||||
AccessibilityActionRecordSwitchView.getInstance().setState(Recorder.STATE_RECORDING);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void stopRecord(Context context) {
|
|
||||||
if (AccessibilityActionRecorder.getInstance().getState() != Recorder.STATE_STOPPED) {
|
|
||||||
AccessibilityActionRecorder.getInstance().stop();
|
|
||||||
String script = AccessibilityActionRecorder.getInstance().getCode();
|
|
||||||
AccessibilityActionRecordSwitchView.getInstance().setState(Recorder.STATE_STOPPED);
|
|
||||||
MainActivity.onActionRecordStopped(context, script);
|
|
||||||
} else {
|
|
||||||
Toast.makeText(App.getApp(), R.string.text_not_recording, Toast.LENGTH_SHORT).show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void redoRecord(Context context) {
|
|
||||||
if (AccessibilityActionRecorder.getInstance().getState() != Recorder.STATE_STOPPED) {
|
|
||||||
AccessibilityActionRecorder.getInstance().stop();
|
|
||||||
AccessibilityActionRecordSwitchView.getInstance().setState(Recorder.STATE_STOPPED);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
package com.stardust.scriptdroid.external.notification.record;
|
|
||||||
|
|
||||||
import android.widget.RemoteViews;
|
|
||||||
|
|
||||||
import com.stardust.scriptdroid.App;
|
|
||||||
import com.stardust.scriptdroid.R;
|
|
||||||
import com.stardust.scriptdroid.record.Recorder;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Stardust on 2017/2/14.
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class AccessibilityActionRecordSwitchView extends RemoteViews {
|
|
||||||
|
|
||||||
private static AccessibilityActionRecordSwitchView instance;
|
|
||||||
|
|
||||||
public static AccessibilityActionRecordSwitchView getInstance() {
|
|
||||||
if (instance == null) {
|
|
||||||
instance = new AccessibilityActionRecordSwitchView();
|
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
|
|
||||||
private AccessibilityActionRecordSwitchView() {
|
|
||||||
super(App.getApp().getPackageName(), R.layout.remote_views_record_switch);
|
|
||||||
setUpOnClick();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setState(int state) {
|
|
||||||
switch (state) {
|
|
||||||
case Recorder.STATE_STOPPED:
|
|
||||||
setImageViewResource(R.id.img_start_or_pause, R.drawable.ic_play_arrow_grey600_48dp);
|
|
||||||
setTextViewText(R.id.text_start_or_pause, App.getApp().getString(R.string.text_start_record));
|
|
||||||
break;
|
|
||||||
case Recorder.STATE_RECORDING:
|
|
||||||
setImageViewResource(R.id.img_start_or_pause, R.drawable.ic_pause_grey600_48dp);
|
|
||||||
setTextViewText(R.id.text_start_or_pause, App.getApp().getString(R.string.text_pause_record));
|
|
||||||
break;
|
|
||||||
case Recorder.STATE_PAUSED:
|
|
||||||
setImageViewResource(R.id.img_start_or_pause, R.drawable.ic_play_arrow_grey600_48dp);
|
|
||||||
setTextViewText(R.id.text_start_or_pause, App.getApp().getString(R.string.text_resume_record));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
AccessibilityActionRecordNotification.showOrUpdateNotification();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setUpOnClick() {
|
|
||||||
setOnClickPendingIntent(R.id.stop, AccessibilityActionRecordNotification.getStopIntent());
|
|
||||||
setOnClickPendingIntent(R.id.start_or_pause, AccessibilityActionRecordNotification.getStartOrPauseIntent());
|
|
||||||
setOnClickPendingIntent(R.id.close, AccessibilityActionRecordNotification.getDeleteIntent());
|
|
||||||
setOnClickPendingIntent(R.id.redo, AccessibilityActionRecordNotification.getRedoIntent());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -87,9 +87,4 @@ public class AccessibilityActionRecorder extends Recorder.DefaultIMPL implements
|
|||||||
mShouldIgnoreFirstAction = shouldIgnoreFirstAction;
|
mShouldIgnoreFirstAction = shouldIgnoreFirstAction;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void setRecordMessageEnabled(boolean recordMessageEnabled) {
|
|
||||||
// TODO: 2017/3/16 添加录制提示
|
|
||||||
mRecordMessageEnabled = recordMessageEnabled;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,8 +7,8 @@ import android.content.Intent;
|
|||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
import android.support.v7.widget.SwitchCompat;
|
||||||
|
|
||||||
import com.stardust.scriptdroid.external.notification.record.AccessibilityActionRecordNotification;
|
|
||||||
import com.stardust.scriptdroid.record.Recorder;
|
import com.stardust.scriptdroid.record.Recorder;
|
||||||
import com.stardust.scriptdroid.record.accessibility.AccessibilityActionRecorder;
|
import com.stardust.scriptdroid.record.accessibility.AccessibilityActionRecorder;
|
||||||
import com.stardust.scriptdroid.Pref;
|
import com.stardust.scriptdroid.Pref;
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package com.stardust.scriptdroid.tool;
|
package com.stardust.scriptdroid.tool;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.support.v4.widget.DrawerLayout;
|
||||||
|
import android.view.Gravity;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import com.stardust.scriptdroid.R;
|
import com.stardust.scriptdroid.R;
|
||||||
@@ -13,7 +15,27 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public interface BackPressedHandler {
|
public interface BackPressedHandler {
|
||||||
|
|
||||||
boolean onBackPressed();
|
boolean onBackPressed(Activity activity);
|
||||||
|
|
||||||
|
class Observer implements BackPressedHandler {
|
||||||
|
|
||||||
|
private List<BackPressedHandler> mBackPressedHandlers = new ArrayList<>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onBackPressed(Activity activity) {
|
||||||
|
for (BackPressedHandler handler : mBackPressedHandlers) {
|
||||||
|
if (handler.onBackPressed(activity)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void registerHandler(BackPressedHandler handler) {
|
||||||
|
mBackPressedHandlers.add(handler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class DoublePressExit implements BackPressedHandler {
|
class DoublePressExit implements BackPressedHandler {
|
||||||
|
|
||||||
@@ -31,7 +53,7 @@ public interface BackPressedHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onBackPressed() {
|
public boolean onBackPressed(Activity activity) {
|
||||||
if (System.currentTimeMillis() - mLastPressedMillis < mDoublePressInterval) {
|
if (System.currentTimeMillis() - mLastPressedMillis < mDoublePressInterval) {
|
||||||
mActivity.finish();
|
mActivity.finish();
|
||||||
} else {
|
} else {
|
||||||
@@ -42,22 +64,23 @@ public interface BackPressedHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class Observer implements BackPressedHandler {
|
class DrawerAutoClose implements BackPressedHandler {
|
||||||
|
|
||||||
private List<BackPressedHandler> mBackPressedHandlers = new ArrayList<>();
|
private DrawerLayout mDrawerLayout;
|
||||||
|
private int mGravity;
|
||||||
|
|
||||||
|
public DrawerAutoClose(DrawerLayout drawerLayout, int gravity){
|
||||||
|
mDrawerLayout = drawerLayout;
|
||||||
|
mGravity = gravity;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onBackPressed() {
|
public boolean onBackPressed(Activity activity) {
|
||||||
for (BackPressedHandler handler : mBackPressedHandlers) {
|
if (mDrawerLayout.isDrawerOpen(mGravity)) {
|
||||||
if (handler.onBackPressed()) {
|
mDrawerLayout.closeDrawer(mGravity);
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void registerHandler(BackPressedHandler handler) {
|
|
||||||
mBackPressedHandlers.add(handler);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public class IntentTool {
|
|||||||
public static boolean goToQQ(Context context, String qq) {
|
public static boolean goToQQ(Context context, String qq) {
|
||||||
try {
|
try {
|
||||||
String url = "mqqwpa://im/chat?chat_type=wpa&uin=" + qq;
|
String url = "mqqwpa://im/chat?chat_type=wpa&uin=" + qq;
|
||||||
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
|
context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
||||||
return true;
|
return true;
|
||||||
} catch (Exception exception) {
|
} catch (Exception exception) {
|
||||||
exception.printStackTrace();
|
exception.printStackTrace();
|
||||||
@@ -33,7 +33,7 @@ public class IntentTool {
|
|||||||
* @return 返回true表示呼起手Q成功,返回false表示呼起失败
|
* @return 返回true表示呼起手Q成功,返回false表示呼起失败
|
||||||
******************/
|
******************/
|
||||||
public static boolean joinQQGroup(Context context, String key) {
|
public static boolean joinQQGroup(Context context, String key) {
|
||||||
Intent intent = new Intent();
|
Intent intent = new Intent().addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
intent.setData(Uri.parse("mqqopensdkapi://bizAgent/qm/qr?url=http%3A%2F%2Fqm.qq.com%2Fcgi-bin%2Fqm%2Fqr%3Ffrom%3Dapp%26p%3Dandroid%26k%3D" + key));
|
intent.setData(Uri.parse("mqqopensdkapi://bizAgent/qm/qr?url=http%3A%2F%2Fqm.qq.com%2Fcgi-bin%2Fqm%2Fqr%3Ffrom%3Dapp%26p%3Dandroid%26k%3D" + key));
|
||||||
// 此Flag可根据具体产品需要自定义,如设置,则在加群界面按返回,返回手Q主界面,不设置,按返回会返回到呼起产品界面 //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
// 此Flag可根据具体产品需要自定义,如设置,则在加群界面按返回,返回手Q主界面,不设置,按返回会返回到呼起产品界面 //intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||||
try {
|
try {
|
||||||
@@ -48,7 +48,7 @@ public class IntentTool {
|
|||||||
public static void goToMail(Context context, String sendTo, @Nullable String title, @Nullable String content) {
|
public static void goToMail(Context context, String sendTo, @Nullable String title, @Nullable String content) {
|
||||||
Uri uri = Uri.parse("mailto:" + sendTo);
|
Uri uri = Uri.parse("mailto:" + sendTo);
|
||||||
String[] email = {sendTo};
|
String[] email = {sendTo};
|
||||||
Intent intent = new Intent(Intent.ACTION_SENDTO, uri);
|
Intent intent = new Intent(Intent.ACTION_SENDTO, uri).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
intent.putExtra(Intent.EXTRA_CC, email);
|
intent.putExtra(Intent.EXTRA_CC, email);
|
||||||
if (title != null)
|
if (title != null)
|
||||||
intent.putExtra(Intent.EXTRA_SUBJECT, title);
|
intent.putExtra(Intent.EXTRA_SUBJECT, title);
|
||||||
@@ -62,7 +62,7 @@ public class IntentTool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void goToLink(Context context, String link) {
|
public static void goToLink(Context context, String link) {
|
||||||
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(link));
|
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(link)).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
context.startActivity(intent);
|
context.startActivity(intent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import android.view.View;
|
|||||||
|
|
||||||
|
|
||||||
import com.stardust.scriptdroid.R;
|
import com.stardust.scriptdroid.R;
|
||||||
|
import com.stardust.scriptdroid.tool.BackPressedHandler;
|
||||||
import com.stardust.theme.ThemeColorManager;
|
import com.stardust.theme.ThemeColorManager;
|
||||||
import com.stardust.theme.app.ThemeColorAppCompatActivity;
|
import com.stardust.theme.app.ThemeColorAppCompatActivity;
|
||||||
|
|
||||||
@@ -27,6 +28,7 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED;
|
|||||||
public class BaseActivity extends AppCompatActivity {
|
public class BaseActivity extends AppCompatActivity {
|
||||||
|
|
||||||
protected static final int PERMISSION_REQUEST_CODE = 11186;
|
protected static final int PERMISSION_REQUEST_CODE = 11186;
|
||||||
|
private BackPressedHandler.Observer mBackPressObserver = new BackPressedHandler.Observer();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
@@ -83,4 +85,15 @@ public class BaseActivity extends AppCompatActivity {
|
|||||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void registerBackPressedHandler(BackPressedHandler handler) {
|
||||||
|
mBackPressObserver.registerHandler(handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBackPressed() {
|
||||||
|
if (!mBackPressObserver.onBackPressed(this)) {
|
||||||
|
super.onBackPressed();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -185,6 +185,7 @@ public class EditActivity extends Editor920Activity {
|
|||||||
final EditorView editorView = (EditorView) findViewById(R.id.editor);
|
final EditorView editorView = (EditorView) findViewById(R.id.editor);
|
||||||
mEditorDelegate.setEditorView(editorView);
|
mEditorDelegate.setEditorView(editorView);
|
||||||
editorView.getEditText().setReadOnly(mReadOnly);
|
editorView.getEditText().setReadOnly(mReadOnly);
|
||||||
|
editorView.getEditText().setHorizontallyScrolling(true);
|
||||||
InputMethodEnhanceBar inputMethodEnhanceBar = (InputMethodEnhanceBar) findViewById(R.id.input_method_enhance_bar);
|
InputMethodEnhanceBar inputMethodEnhanceBar = (InputMethodEnhanceBar) findViewById(R.id.input_method_enhance_bar);
|
||||||
if (mReadOnly) {
|
if (mReadOnly) {
|
||||||
inputMethodEnhanceBar.setVisibility(View.GONE);
|
inputMethodEnhanceBar.setVisibility(View.GONE);
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package com.stardust.scriptdroid.ui.edit;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
|
||||||
|
import com.stardust.scriptdroid.ui.BaseActivity;
|
||||||
|
|
||||||
|
import xyz.iridiumion.iridiumhighlightingeditor.editor.HighlightingDefinition;
|
||||||
|
import xyz.iridiumion.iridiumhighlightingeditor.editor.IridiumHighlightingEditorJ;
|
||||||
|
import xyz.iridiumion.iridiumhighlightingeditor.highlightingdefinitions.definitions.JavaScriptHighlightingDefinition;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Stardust on 2017/3/22.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class IridiumEditActivity extends BaseActivity {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
IridiumHighlightingEditorJ editorJ = new IridiumHighlightingEditorJ(this);
|
||||||
|
editorJ.setText("1234567");
|
||||||
|
editorJ.loadHighlightingDefinition(new JavaScriptHighlightingDefinition());
|
||||||
|
setContentView(editorJ);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -57,7 +57,8 @@ public class InputMethodEnhanceBar extends RecyclerView implements CodeCompletio
|
|||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
int position = getChildViewHolder(v).getAdapterPosition();
|
int position = getChildViewHolder(v).getAdapterPosition();
|
||||||
mEditTextBridge.appendText(mCodeCompletionList.get(position).getAppendText());
|
if (position >= 0 && position < mCodeCompletionList.size())
|
||||||
|
mEditTextBridge.appendText(mCodeCompletionList.get(position).getAppendText());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -65,6 +66,8 @@ public class InputMethodEnhanceBar extends RecyclerView implements CodeCompletio
|
|||||||
@Override
|
@Override
|
||||||
public boolean onLongClick(View v) {
|
public boolean onLongClick(View v) {
|
||||||
int position = getChildViewHolder(v).getAdapterPosition();
|
int position = getChildViewHolder(v).getAdapterPosition();
|
||||||
|
if (position < 0 || position >= mCodeCompletionList.size())
|
||||||
|
return false;
|
||||||
((ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("", mCodeCompletionList.get(position).getDisplayText()));
|
((ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE)).setPrimaryClip(ClipData.newPlainText("", mCodeCompletionList.get(position).getDisplayText()));
|
||||||
Toast.makeText(getContext(), R.string.text_copied, Toast.LENGTH_SHORT).show();
|
Toast.makeText(getContext(), R.string.text_copied, Toast.LENGTH_SHORT).show();
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package com.stardust.scriptdroid.ui.main;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.support.annotation.CallSuper;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
import android.support.v7.app.ActionBarDrawerToggle;
|
||||||
|
import android.support.v7.widget.Toolbar;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.FrameLayout;
|
||||||
|
|
||||||
|
import com.stardust.scriptdroid.R;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Stardust on 2017/3/23.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public abstract class AppbarWithTabFragment extends BottomNavigationFragment {
|
||||||
|
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public View createView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||||
|
View view = inflater.inflate(R.layout.fragment_app_bar_tab, container, false);
|
||||||
|
FrameLayout contentContainer = (FrameLayout) view.findViewById(R.id.content);
|
||||||
|
contentContainer.addView(createContentView(inflater, contentContainer));
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
@CallSuper
|
||||||
|
@Override
|
||||||
|
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
|
||||||
|
super.onViewCreated(view, savedInstanceState);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract View createContentView(LayoutInflater inflater, @Nullable ViewGroup container);
|
||||||
|
}
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
package com.stardust.scriptdroid.ui.main;
|
||||||
|
|
||||||
|
|
||||||
|
import android.support.v4.app.FragmentManager;
|
||||||
|
import android.support.v4.app.FragmentPagerAdapter;
|
||||||
|
import android.support.v4.view.ViewPager;
|
||||||
|
|
||||||
|
import com.ashokvarma.bottomnavigation.BottomNavigationBar;
|
||||||
|
import com.ashokvarma.bottomnavigation.BottomNavigationItem;
|
||||||
|
import com.stardust.app.Fragment;
|
||||||
|
import com.stardust.theme.ThemeColor;
|
||||||
|
import com.stardust.theme.ThemeColorManager;
|
||||||
|
import com.stardust.theme.ThemeColorMutable;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Stardust on 2017/3/23.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public abstract class BottomNavigationFragment extends Fragment {
|
||||||
|
|
||||||
|
public static class Builder implements BottomNavigationBar.OnTabSelectedListener, ThemeColorMutable {
|
||||||
|
private int mFragmentId;
|
||||||
|
private BottomNavigationBar mBottomNavigationBar;
|
||||||
|
private FragmentManager mFragmentManager;
|
||||||
|
private List<BottomNavigationFragment> mFragments = new ArrayList<>();
|
||||||
|
|
||||||
|
public Builder(int fragmentId, BottomNavigationBar bottomNavigationBar, FragmentManager fragmentManager) {
|
||||||
|
mFragmentId = fragmentId;
|
||||||
|
mBottomNavigationBar = bottomNavigationBar;
|
||||||
|
mFragmentManager = fragmentManager;
|
||||||
|
mBottomNavigationBar.setTabSelectedListener(this);
|
||||||
|
ThemeColorManager.add(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder add(BottomNavigationFragment fragment) {
|
||||||
|
mFragments.add(fragment);
|
||||||
|
mBottomNavigationBar.addItem(new BottomNavigationItem(fragment.getIconResId(), fragment.getTitle()));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void build() {
|
||||||
|
mBottomNavigationBar.setFirstSelectedPosition(0);
|
||||||
|
mBottomNavigationBar.initialise();
|
||||||
|
mFragmentManager.beginTransaction().replace(mFragmentId, mFragments.get(0)).commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTabSelected(int position) {
|
||||||
|
BottomNavigationFragment fragment = mFragments.get(position);
|
||||||
|
mFragmentManager.beginTransaction().replace(mFragmentId, fragment).commit();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTabUnselected(int position) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onTabReselected(int position) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setThemeColor(ThemeColor themeColor) {
|
||||||
|
mBottomNavigationBar.setActiveColor("#" + Integer.toHexString(themeColor.colorPrimary).substring(2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract String getTitle();
|
||||||
|
|
||||||
|
protected abstract int getIconResId();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@ package com.stardust.scriptdroid.ui.main;
|
|||||||
|
|
||||||
import android.Manifest;
|
import android.Manifest;
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
|
import android.app.Activity;
|
||||||
import android.content.ClipData;
|
import android.content.ClipData;
|
||||||
import android.content.ClipboardManager;
|
import android.content.ClipboardManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
@@ -12,7 +13,6 @@ import android.os.Bundle;
|
|||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.design.widget.Snackbar;
|
import android.support.design.widget.Snackbar;
|
||||||
import android.support.design.widget.TabLayout;
|
import android.support.design.widget.TabLayout;
|
||||||
import android.support.v4.app.Fragment;
|
|
||||||
import android.support.v4.view.ViewPager;
|
import android.support.v4.view.ViewPager;
|
||||||
import android.support.v4.widget.DrawerLayout;
|
import android.support.v4.widget.DrawerLayout;
|
||||||
import android.support.v7.app.ActionBarDrawerToggle;
|
import android.support.v7.app.ActionBarDrawerToggle;
|
||||||
@@ -27,20 +27,19 @@ import android.widget.Toast;
|
|||||||
import com.afollestad.materialdialogs.DialogAction;
|
import com.afollestad.materialdialogs.DialogAction;
|
||||||
import com.afollestad.materialdialogs.MaterialDialog;
|
import com.afollestad.materialdialogs.MaterialDialog;
|
||||||
import com.afollestad.materialdialogs.folderselector.FileChooserDialog;
|
import com.afollestad.materialdialogs.folderselector.FileChooserDialog;
|
||||||
import com.stardust.app.NotRemindAgainDialog;
|
import com.stardust.app.FragmentPagerAdapterBuilder;
|
||||||
|
import com.stardust.app.NotAskAgainDialog;
|
||||||
import com.stardust.app.OnActivityResultDelegate;
|
import com.stardust.app.OnActivityResultDelegate;
|
||||||
import com.stardust.scriptdroid.Pref;
|
import com.stardust.scriptdroid.Pref;
|
||||||
import com.stardust.scriptdroid.droid.script.file.ScriptFile;
|
import com.stardust.scriptdroid.droid.script.file.ScriptFile;
|
||||||
import com.stardust.scriptdroid.droid.script.file.ScriptFileList;
|
import com.stardust.scriptdroid.droid.script.file.ScriptFileList;
|
||||||
import com.stardust.scriptdroid.external.notification.record.AccessibilityActionRecordNotification;
|
|
||||||
import com.stardust.scriptdroid.record.inputevent.InputEventRecorder;
|
|
||||||
import com.stardust.scriptdroid.record.inputevent.InputEventToJsRecorder;
|
|
||||||
import com.stardust.scriptdroid.service.AccessibilityWatchDogService;
|
import com.stardust.scriptdroid.service.AccessibilityWatchDogService;
|
||||||
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
|
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
|
||||||
import com.stardust.scriptdroid.tool.ImageSelector;
|
import com.stardust.scriptdroid.tool.ImageSelector;
|
||||||
import com.stardust.scriptdroid.ui.BaseActivity;
|
import com.stardust.scriptdroid.ui.BaseActivity;
|
||||||
import com.stardust.scriptdroid.ui.main.my_script_list.MyScriptListFragment;
|
import com.stardust.scriptdroid.ui.main.my_script_list.MyScriptListFragment;
|
||||||
import com.stardust.scriptdroid.ui.main.sample_list.SampleScriptListFragment;
|
import com.stardust.scriptdroid.ui.main.sample_list.SampleScriptListFragment;
|
||||||
|
import com.stardust.scriptdroid.ui.main.task.TaskManagerFragment;
|
||||||
import com.stardust.scriptdroid.ui.settings.SettingsActivity;
|
import com.stardust.scriptdroid.ui.settings.SettingsActivity;
|
||||||
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
|
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
|
||||||
import com.stardust.util.MessageEvent;
|
import com.stardust.util.MessageEvent;
|
||||||
@@ -50,7 +49,6 @@ import com.stardust.scriptdroid.BuildConfig;
|
|||||||
import com.stardust.scriptdroid.R;
|
import com.stardust.scriptdroid.R;
|
||||||
import com.stardust.scriptdroid.tool.FileUtils;
|
import com.stardust.scriptdroid.tool.FileUtils;
|
||||||
import com.stardust.scriptdroid.tool.BackPressedHandler;
|
import com.stardust.scriptdroid.tool.BackPressedHandler;
|
||||||
import com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation;
|
|
||||||
import com.stardust.view.ViewBinder;
|
import com.stardust.view.ViewBinder;
|
||||||
import com.stardust.view.accessibility.AccessibilityServiceUtils;
|
import com.stardust.view.accessibility.AccessibilityServiceUtils;
|
||||||
|
|
||||||
@@ -65,39 +63,46 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
|
|||||||
|
|
||||||
private static final String ACTION_ON_ACTION_RECORD_STOPPED = "ACTION_ON_ACTION_RECORD_STOPPED";
|
private static final String ACTION_ON_ACTION_RECORD_STOPPED = "ACTION_ON_ACTION_RECORD_STOPPED";
|
||||||
private static final String ARGUMENT_SCRIPT = "ARGUMENT_SCRIPT";
|
private static final String ARGUMENT_SCRIPT = "ARGUMENT_SCRIPT";
|
||||||
private static final String ACTION_ON_ROOT_RECORD_STOPPED = "ACTION_ON_ROOT_RECORD_STOPPED";
|
|
||||||
|
|
||||||
private ScriptFileList mScriptFileList;
|
|
||||||
private DrawerLayout mDrawerLayout;
|
private DrawerLayout mDrawerLayout;
|
||||||
@ViewBinding.Id(R.id.bottom_menu)
|
@ViewBinding.Id(R.id.bottom_menu)
|
||||||
private SlidingUpPanel mAddBottomMenuPanel;
|
private SlidingUpPanel mAddBottomMenuPanel;
|
||||||
|
private FragmentPagerAdapterBuilder.StoredFragmentPagerAdapter mPagerAdapter;
|
||||||
|
|
||||||
private MyScriptListFragment mMyScriptListFragment;
|
|
||||||
private SampleScriptListFragment mSampleScriptListFragment;
|
|
||||||
private OnActivityResultDelegate.Intermediary mActivityResultIntermediary = new OnActivityResultDelegate.Intermediary();
|
private OnActivityResultDelegate.Intermediary mActivityResultIntermediary = new OnActivityResultDelegate.Intermediary();
|
||||||
private BackPressedHandler.Observer mBackPressObserver = new BackPressedHandler.Observer();
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setUpUI();
|
setUpUI();
|
||||||
checkPermissions();
|
checkPermissions();
|
||||||
registerBackPressHandler();
|
registerBackPressHandlers();
|
||||||
handleIntent(getIntent());
|
handleIntent(getIntent());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void registerBackPressHandler() {
|
private void registerBackPressHandlers() {
|
||||||
mBackPressObserver.registerHandler(new BackPressedHandler.DoublePressExit(this));
|
registerBackPressedHandler(new BackPressedHandler() {
|
||||||
|
@Override
|
||||||
|
public boolean onBackPressed(Activity activity) {
|
||||||
|
if (mAddBottomMenuPanel.isShowing()) {
|
||||||
|
mAddBottomMenuPanel.dismiss();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
registerBackPressedHandler(new BackPressedHandler.DrawerAutoClose(mDrawerLayout, Gravity.START));
|
||||||
|
registerBackPressedHandler(new BackPressedHandler.DoublePressExit(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkPermissions() {
|
private void checkPermissions() {
|
||||||
checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
|
checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
|
||||||
goToAccessibilityPermissionSettingIfDisabled();
|
showAccessibilitySettingPromptIfDisabled();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void goToAccessibilityPermissionSettingIfDisabled() {
|
private void showAccessibilitySettingPromptIfDisabled() {
|
||||||
if (!AccessibilityServiceUtils.isAccessibilityServiceEnabled(this, AccessibilityWatchDogService.class)) {
|
if (!AccessibilityServiceUtils.isAccessibilityServiceEnabled(this, AccessibilityWatchDogService.class)) {
|
||||||
new NotRemindAgainDialog.Builder(this, "goToAccessibilityPermissionSettingIfDisabled")
|
new NotAskAgainDialog.Builder(this, "showAccessibilitySettingPromptIfDisabled")
|
||||||
.title(R.string.text_need_to_enable_accessibility_service)
|
.title(R.string.text_need_to_enable_accessibility_service)
|
||||||
.content(R.string.explain_accessibility_permission)
|
.content(R.string.explain_accessibility_permission)
|
||||||
.positiveText(R.string.text_go_to_setting)
|
.positiveText(R.string.text_go_to_setting)
|
||||||
@@ -123,33 +128,23 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void addScriptFile(String name, String path) {
|
private void addScriptFile(String name, String path) {
|
||||||
mScriptFileList.add(new ScriptFile(name, path));
|
ScriptFileList.getImpl().add(new ScriptFile(name, path));
|
||||||
EventBus.getDefault().post(new MessageEvent(MyScriptListFragment.MESSAGE_SCRIPT_FILE_ADDED));
|
EventBus.getDefault().post(new MessageEvent(MyScriptListFragment.MESSAGE_SCRIPT_FILE_ADDED));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpUI() {
|
private void setUpUI() {
|
||||||
mDrawerLayout = (DrawerLayout) View.inflate(this, R.layout.activity_main, null);
|
mDrawerLayout = (DrawerLayout) View.inflate(this, R.layout.activity_main, null);
|
||||||
setContentView(mDrawerLayout);
|
setContentView(mDrawerLayout);
|
||||||
setUpFragment();
|
|
||||||
setUpToolbar();
|
setUpToolbar();
|
||||||
setUpTabLayout();
|
setUpTabViewPager();
|
||||||
setUpDrawerHeader();
|
setUpDrawerHeader();
|
||||||
|
setUpFragment();
|
||||||
ViewBinder.bind(this);
|
ViewBinder.bind(this);
|
||||||
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
|
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setUpFragment() {
|
private void setUpFragment() {
|
||||||
SlideMenuFragment.setFragment(this, R.id.fragment_slide_menu);
|
SlideMenuFragment.setFragment(this, R.id.fragment_slide_menu);
|
||||||
mMyScriptListFragment = new MyScriptListFragment();
|
|
||||||
mScriptFileList = ScriptFileList.getImpl();
|
|
||||||
mSampleScriptListFragment = new SampleScriptListFragment();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setUpTabLayout() {
|
|
||||||
TabLayout tabLayout = $(R.id.tab);
|
|
||||||
ViewPager viewPager = $(R.id.viewpager);
|
|
||||||
viewPager.setAdapter(new FragmentPagerAdapter());
|
|
||||||
tabLayout.setupWithViewPager(viewPager);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressLint("SetTextI18n")
|
@SuppressLint("SetTextI18n")
|
||||||
@@ -164,7 +159,6 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
|
|||||||
if (path != null) {
|
if (path != null) {
|
||||||
setAppBarImage(path);
|
setAppBarImage(path);
|
||||||
}
|
}
|
||||||
$(R.id.drawer).setFitsSystemWindows(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setDrawerHeaderImage(String path) {
|
private void setDrawerHeaderImage(String path) {
|
||||||
@@ -178,13 +172,23 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
|
|||||||
Toolbar toolbar = $(R.id.toolbar);
|
Toolbar toolbar = $(R.id.toolbar);
|
||||||
setSupportActionBar(toolbar);
|
setSupportActionBar(toolbar);
|
||||||
toolbar.setTitle(R.string._app_name);
|
toolbar.setTitle(R.string._app_name);
|
||||||
|
|
||||||
ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.text_drawer_open,
|
ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.text_drawer_open,
|
||||||
R.string.text_drawer_close);
|
R.string.text_drawer_close);
|
||||||
drawerToggle.syncState();
|
drawerToggle.syncState();
|
||||||
mDrawerLayout.addDrawerListener(drawerToggle);
|
mDrawerLayout.addDrawerListener(drawerToggle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setUpTabViewPager() {
|
||||||
|
TabLayout tabLayout = $(R.id.tab);
|
||||||
|
ViewPager viewPager = $(R.id.viewpager);
|
||||||
|
mPagerAdapter = new FragmentPagerAdapterBuilder(this)
|
||||||
|
.add(new MyScriptListFragment(), R.string.text_my_script)
|
||||||
|
.add(new SampleScriptListFragment(), R.string.text_sample_script)
|
||||||
|
.add(new TaskManagerFragment(), R.string.text_task_manage)
|
||||||
|
.build();
|
||||||
|
viewPager.setAdapter(mPagerAdapter);
|
||||||
|
tabLayout.setupWithViewPager(viewPager);
|
||||||
|
}
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.add)
|
@ViewBinding.Click(R.id.add)
|
||||||
private void showAddFilePanel() {
|
private void showAddFilePanel() {
|
||||||
@@ -218,7 +222,7 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
addScriptFile(name, path);
|
addScriptFile(name, path);
|
||||||
new ScriptFileOperation.Edit().operate(mMyScriptListFragment.getScriptListRecyclerView(), mScriptFileList, mScriptFileList.size() - 1);
|
((MyScriptListFragment) mPagerAdapter.getStoredFragment(0)).editLatest();
|
||||||
} else {
|
} else {
|
||||||
Snackbar.make(mDrawerLayout, R.string.text_file_create_fail, Snackbar.LENGTH_LONG).show();
|
Snackbar.make(mDrawerLayout, R.string.text_file_create_fail, Snackbar.LENGTH_LONG).show();
|
||||||
}
|
}
|
||||||
@@ -232,27 +236,6 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
|
|||||||
.show();
|
.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.record)
|
|
||||||
private void startScriptRecord() {
|
|
||||||
if (AccessibilityWatchDogService.getInstance() == null) {
|
|
||||||
Snackbar.make(mDrawerLayout, R.string.text_need_enable_accessibility_service_to_record, Snackbar.LENGTH_SHORT).show();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
AccessibilityActionRecordNotification.showOrUpdateNotification();
|
|
||||||
Snackbar.make(mDrawerLayout, R.string.hint_start_record, Snackbar.LENGTH_SHORT).show();
|
|
||||||
}
|
|
||||||
|
|
||||||
private InputEventRecorder mInputEventRecorder;
|
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.root_record)
|
|
||||||
private void startRootRecord() {
|
|
||||||
if (mInputEventRecorder == null) {
|
|
||||||
mInputEventRecorder = new InputEventToJsRecorder();
|
|
||||||
mInputEventRecorder.listen();
|
|
||||||
}
|
|
||||||
Snackbar.make(mDrawerLayout, R.string.hint_start_root_record, Snackbar.LENGTH_SHORT).show();
|
|
||||||
}
|
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.setting)
|
@ViewBinding.Click(R.id.setting)
|
||||||
private void startSettingActivity() {
|
private void startSettingActivity() {
|
||||||
startActivity(new Intent(this, SettingsActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
startActivity(new Intent(this, SettingsActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
||||||
@@ -294,13 +277,6 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
|
|||||||
case ACTION_ON_ACTION_RECORD_STOPPED:
|
case ACTION_ON_ACTION_RECORD_STOPPED:
|
||||||
handleRecordedScript(intent.getStringExtra(ARGUMENT_SCRIPT));
|
handleRecordedScript(intent.getStringExtra(ARGUMENT_SCRIPT));
|
||||||
break;
|
break;
|
||||||
case ACTION_ON_ROOT_RECORD_STOPPED:
|
|
||||||
if (mInputEventRecorder != null) {
|
|
||||||
mInputEventRecorder.stop();
|
|
||||||
handleRecordedScript(mInputEventRecorder.getCode());
|
|
||||||
mInputEventRecorder = null;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -329,19 +305,6 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
|
|||||||
})
|
})
|
||||||
.canceledOnTouchOutside(false)
|
.canceledOnTouchOutside(false)
|
||||||
.show();
|
.show();
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBackPressed() {
|
|
||||||
if (mAddBottomMenuPanel.isShowing()) {
|
|
||||||
mAddBottomMenuPanel.dismiss();
|
|
||||||
} else if (mDrawerLayout.isDrawerOpen(Gravity.START)) {
|
|
||||||
mDrawerLayout.closeDrawer(Gravity.START);
|
|
||||||
} else {
|
|
||||||
mBackPressObserver.onBackPressed();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -362,14 +325,6 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
|
|||||||
context.startActivity(intent);
|
context.startActivity(intent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static void onRootRecordStopped(Context context) {
|
|
||||||
Intent intent = new Intent(context, MainActivity.class)
|
|
||||||
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
|
||||||
.putExtra(EXTRA_ACTION, ACTION_ON_ROOT_RECORD_STOPPED);
|
|
||||||
context.startActivity(intent);
|
|
||||||
}
|
|
||||||
|
|
||||||
@ViewBinding.Click(R.id.toolbar)
|
@ViewBinding.Click(R.id.toolbar)
|
||||||
public void OnToolbarClick() {
|
public void OnToolbarClick() {
|
||||||
new ImageSelector(this, mActivityResultIntermediary, new ImageSelector.ImageSelectorCallback() {
|
new ImageSelector(this, mActivityResultIntermediary, new ImageSelector.ImageSelectorCallback() {
|
||||||
@@ -385,29 +340,7 @@ public class MainActivity extends BaseActivity implements FileChooserDialog.File
|
|||||||
private void setAppBarImage(String path) {
|
private void setAppBarImage(String path) {
|
||||||
Drawable d = BitmapDrawable.createFromPath(path);
|
Drawable d = BitmapDrawable.createFromPath(path);
|
||||||
if (d != null) {
|
if (d != null) {
|
||||||
$(R.id.app_bar).setBackground(d);
|
((ImageView) $(R.id.app_bar_bg)).setImageDrawable(d);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class FragmentPagerAdapter extends android.support.v4.app.FragmentPagerAdapter {
|
|
||||||
|
|
||||||
FragmentPagerAdapter() {
|
|
||||||
super(MainActivity.this.getSupportFragmentManager());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Fragment getItem(int position) {
|
|
||||||
return position == 0 ? mMyScriptListFragment : mSampleScriptListFragment;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getCount() {
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public CharSequence getPageTitle(int position) {
|
|
||||||
return getString(position == 0 ? R.string.text_my_script : R.string.text_sample_script);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import android.content.Intent;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.support.design.widget.Snackbar;
|
import android.support.design.widget.Snackbar;
|
||||||
|
import android.support.v4.app.FragmentActivity;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
import android.support.v7.widget.SwitchCompat;
|
import android.support.v7.widget.SwitchCompat;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
@@ -33,7 +34,7 @@ import org.greenrobot.eventbus.Subscribe;
|
|||||||
public class SlideMenuFragment extends Fragment {
|
public class SlideMenuFragment extends Fragment {
|
||||||
|
|
||||||
|
|
||||||
public static void setFragment(AppCompatActivity activity, int viewId) {
|
public static void setFragment(FragmentActivity activity, int viewId) {
|
||||||
SlideMenuFragment fragment = new SlideMenuFragment();
|
SlideMenuFragment fragment = new SlideMenuFragment();
|
||||||
activity.getSupportFragmentManager().beginTransaction().replace(viewId, fragment).commit();
|
activity.getSupportFragmentManager().beginTransaction().replace(viewId, fragment).commit();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.stardust.scriptdroid.ui.main.my_script_list;
|
package com.stardust.scriptdroid.ui.main.my_script_list;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.support.v7.widget.RecyclerView;
|
import android.support.v7.widget.RecyclerView;
|
||||||
@@ -12,6 +13,8 @@ import com.stardust.scriptdroid.R;
|
|||||||
import com.stardust.scriptdroid.droid.script.file.ScriptFileList;
|
import com.stardust.scriptdroid.droid.script.file.ScriptFileList;
|
||||||
import com.stardust.scriptdroid.droid.script.file.SharedPrefScriptFileList;
|
import com.stardust.scriptdroid.droid.script.file.SharedPrefScriptFileList;
|
||||||
import com.stardust.scriptdroid.tool.BackPressedHandler;
|
import com.stardust.scriptdroid.tool.BackPressedHandler;
|
||||||
|
import com.stardust.scriptdroid.ui.BaseActivity;
|
||||||
|
import com.stardust.scriptdroid.ui.main.operation.ScriptFileOperation;
|
||||||
import com.stardust.util.MessageEvent;
|
import com.stardust.util.MessageEvent;
|
||||||
import com.stardust.widget.SimpleAdapterDataObserver;
|
import com.stardust.widget.SimpleAdapterDataObserver;
|
||||||
|
|
||||||
@@ -30,10 +33,14 @@ public class MyScriptListFragment extends Fragment implements BackPressedHandler
|
|||||||
private ScriptFileList mScriptFileList;
|
private ScriptFileList mScriptFileList;
|
||||||
private View mNoScriptHint;
|
private View mNoScriptHint;
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
EventBus.getDefault().register(this);
|
EventBus.getDefault().register(this);
|
||||||
|
if(!(getActivity() instanceof BaseActivity)){
|
||||||
|
throw new IllegalArgumentException("The fragment can only be used in BaseActivity");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@@ -61,8 +68,9 @@ public class MyScriptListFragment extends Fragment implements BackPressedHandler
|
|||||||
mScriptListRecyclerView.setScriptFileList(mScriptFileList);
|
mScriptListRecyclerView.setScriptFileList(mScriptFileList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//// FIXME: 2017/3/24
|
||||||
@Override
|
@Override
|
||||||
public boolean onBackPressed() {
|
public boolean onBackPressed(Activity activity) {
|
||||||
if (mScriptListRecyclerView.getScriptFileOperationPopupMenu().isShowing()) {
|
if (mScriptListRecyclerView.getScriptFileOperationPopupMenu().isShowing()) {
|
||||||
mScriptListRecyclerView.getScriptFileOperationPopupMenu().dismiss();
|
mScriptListRecyclerView.getScriptFileOperationPopupMenu().dismiss();
|
||||||
return true;
|
return true;
|
||||||
@@ -98,4 +106,8 @@ public class MyScriptListFragment extends Fragment implements BackPressedHandler
|
|||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
EventBus.getDefault().unregister(this);
|
EventBus.getDefault().unregister(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void editLatest() {
|
||||||
|
ScriptFileOperation.Edit.getInstance().operate(mScriptListRecyclerView, mScriptFileList, mScriptFileList.size() - 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import com.stardust.scriptdroid.droid.script.file.ScriptFileList;
|
|||||||
import com.stardust.scriptdroid.external.shortcut.Shortcut;
|
import com.stardust.scriptdroid.external.shortcut.Shortcut;
|
||||||
import com.stardust.scriptdroid.external.shortcut.ShortcutActivity;
|
import com.stardust.scriptdroid.external.shortcut.ShortcutActivity;
|
||||||
import com.stardust.scriptdroid.ui.edit.EditActivity;
|
import com.stardust.scriptdroid.ui.edit.EditActivity;
|
||||||
|
import com.stardust.scriptdroid.ui.edit.IridiumEditActivity;
|
||||||
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
|
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
|
||||||
import com.stardust.scriptdroid.App;
|
import com.stardust.scriptdroid.App;
|
||||||
import com.stardust.scriptdroid.R;
|
import com.stardust.scriptdroid.R;
|
||||||
@@ -67,14 +68,28 @@ public abstract class ScriptFileOperation {
|
|||||||
|
|
||||||
public static class Edit extends ScriptFileOperation {
|
public static class Edit extends ScriptFileOperation {
|
||||||
|
|
||||||
|
private static Edit instance = new Edit();
|
||||||
|
|
||||||
public Edit() {
|
public Edit() {
|
||||||
super(App.getApp().getString(R.string.text_edit), R.drawable.ic_edit_green_48dp);
|
super(App.getApp().getString(R.string.text_edit), R.drawable.ic_edit_green_48dp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Edit getInstance() {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setInstance(Edit instance) {
|
||||||
|
Edit.instance = instance;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void operate(RecyclerView recyclerView, ScriptFileList scriptFileList, int position) {
|
public void operate(RecyclerView recyclerView, ScriptFileList scriptFileList, int position) {
|
||||||
ScriptFile scriptFile = scriptFileList.get(position);
|
ScriptFile scriptFile = scriptFileList.get(position);
|
||||||
EditActivity.editFile(App.getApp(), scriptFile.name, scriptFile.path);
|
EditActivity.editFile(App.getApp(), scriptFile.name, scriptFile.path);
|
||||||
|
//脚本
|
||||||
|
//任务&控制台
|
||||||
|
//教程
|
||||||
|
//
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -88,7 +103,7 @@ public abstract class ScriptFileOperation {
|
|||||||
public void operate(RecyclerView recyclerView, ScriptFileList scriptFileList, int position) {
|
public void operate(RecyclerView recyclerView, ScriptFileList scriptFileList, int position) {
|
||||||
ScriptFile scriptFile = scriptFileList.get(position);
|
ScriptFile scriptFile = scriptFileList.get(position);
|
||||||
Uri uri = Uri.parse("file://" + scriptFile.path);
|
Uri uri = Uri.parse("file://" + scriptFile.path);
|
||||||
App.getApp().startActivity(new Intent(Intent.ACTION_VIEW).setDataAndType(uri, "text/plain"));
|
App.getApp().startActivity(new Intent(Intent.ACTION_VIEW).setDataAndType(uri, "text/plain").addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,7 +171,8 @@ public abstract class ScriptFileOperation {
|
|||||||
public void operate(RecyclerView recyclerView, ScriptFileList scriptFileList, int position) {
|
public void operate(RecyclerView recyclerView, ScriptFileList scriptFileList, int position) {
|
||||||
boolean succeed = scriptFileList.deleteFromFileSystem(position);
|
boolean succeed = scriptFileList.deleteFromFileSystem(position);
|
||||||
EventBus.getDefault().post(new ShowMessageEvent(succeed ? R.string.text_already_delete : R.string.text_delete_failed));
|
EventBus.getDefault().post(new ShowMessageEvent(succeed ? R.string.text_already_delete : R.string.text_delete_failed));
|
||||||
recyclerView.getAdapter().notifyItemRemoved(position);
|
if (succeed)
|
||||||
|
recyclerView.getAdapter().notifyItemRemoved(position);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package com.stardust.scriptdroid.ui.main.task;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
|
import com.stardust.app.Fragment;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Stardust on 2017/3/24.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class TaskManagerFragment extends Fragment {
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public View createView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package com.stardust.scriptdroid.ui.main.task;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Stardust on 2017/3/24.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class TaskManagerRecyclerView {
|
||||||
|
}
|
||||||
@@ -57,13 +57,13 @@ public class CommonMarkdownView extends WebView {
|
|||||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
|
||||||
@Override
|
@Override
|
||||||
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
|
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
|
||||||
getContext().startActivity(new Intent(Intent.ACTION_VIEW).setData(request.getUrl()));
|
getContext().startActivity(new Intent(Intent.ACTION_VIEW).setData(request.getUrl()).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean shouldOverrideUrlLoading(WebView view, String url) {
|
public boolean shouldOverrideUrlLoading(WebView view, String url) {
|
||||||
getContext().startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse(url)));
|
getContext().startActivity(new Intent(Intent.ACTION_VIEW).setData(Uri.parse(url)).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
5
app/src/main/res/drawable/toolbar_bg_top_clip.xml
Normal file
5
app/src/main/res/drawable/toolbar_bg_top_clip.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<clip xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:clipOrientation="vertical"
|
||||||
|
android:drawable="@drawable/toolbar_bg"
|
||||||
|
android:gravity="top"/>
|
||||||
@@ -12,14 +12,22 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
<android.support.design.widget.AppBarLayout
|
<ImageView
|
||||||
android:id="@+id/app_bar"
|
android:id="@+id/app_bar_bg"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="128.5dp"
|
android:layout_height="128.5dp"
|
||||||
android:background="@drawable/toolbar_bg"
|
android:scaleType="fitXY"
|
||||||
|
android:src="@drawable/toolbar_bg"/>
|
||||||
|
|
||||||
|
<android.support.design.widget.AppBarLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@android:color/transparent"
|
||||||
|
android:clipToPadding="false"
|
||||||
android:paddingTop="24dp"
|
android:paddingTop="24dp"
|
||||||
android:theme="@style/AppTheme.AppBarOverlay">
|
android:theme="@style/AppTheme.AppBarOverlay">
|
||||||
|
|
||||||
|
|
||||||
<android.support.v7.widget.Toolbar
|
<android.support.v7.widget.Toolbar
|
||||||
android:id="@+id/toolbar"
|
android:id="@+id/toolbar"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@@ -41,15 +49,21 @@
|
|||||||
<android.support.design.widget.TabLayout
|
<android.support.design.widget.TabLayout
|
||||||
android:id="@+id/tab"
|
android:id="@+id/tab"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="48dp"
|
||||||
app:tabGravity="fill"
|
app:tabGravity="fill"
|
||||||
app:tabIndicatorColor="#E91E63"
|
app:tabIndicatorColor="@android:color/white"
|
||||||
app:tabMode="fixed"
|
app:tabMode="fixed"
|
||||||
app:tabTextColor="@android:color/primary_text_dark"/>
|
app:tabSelectedTextColor="@android:color/primary_text_dark"
|
||||||
|
app:tabTextColor="@android:color/secondary_text_dark"/>
|
||||||
|
|
||||||
</android.support.design.widget.AppBarLayout>
|
</android.support.design.widget.AppBarLayout>
|
||||||
|
|
||||||
<include layout="@layout/content_main"/>
|
<include
|
||||||
|
android:id="@+id/content_main"
|
||||||
|
layout="@layout/content_main"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
|
||||||
|
|
||||||
<com.stardust.widget.SlidingUpPanel
|
<com.stardust.widget.SlidingUpPanel
|
||||||
android:id="@+id/bottom_menu"
|
android:id="@+id/bottom_menu"
|
||||||
@@ -117,59 +131,6 @@
|
|||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/record"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:visibility="gone"
|
|
||||||
android:background="?attr/selectableItemBackgroundBorderless"
|
|
||||||
android:gravity="center"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<com.stardust.theme.widget.ThemeColorImageView
|
|
||||||
android:layout_width="60dp"
|
|
||||||
android:layout_height="60dp"
|
|
||||||
android:padding="10dp"
|
|
||||||
android:src="@drawable/ic_video_record"/>
|
|
||||||
|
|
||||||
<com.stardust.theme.widget.ThemeColorTextView
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:gravity="center"
|
|
||||||
android:text="@string/text_script_record"
|
|
||||||
android:textColor="@color/colorPrimary"
|
|
||||||
android:textSize="16sp"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/root_record"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:visibility="gone"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:background="?attr/selectableItemBackgroundBorderless"
|
|
||||||
android:gravity="center"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<com.stardust.theme.widget.ThemeColorImageView
|
|
||||||
android:layout_width="60dp"
|
|
||||||
android:layout_height="60dp"
|
|
||||||
android:padding="10dp"
|
|
||||||
android:src="@drawable/ic_video_record"/>
|
|
||||||
|
|
||||||
<com.stardust.theme.widget.ThemeColorTextView
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:gravity="center"
|
|
||||||
android:text="@string/text_root_script_record"
|
|
||||||
android:textColor="@color/colorPrimary"
|
|
||||||
android:textSize="16sp"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</com.stardust.widget.SlidingUpPanel>
|
</com.stardust.widget.SlidingUpPanel>
|
||||||
@@ -182,6 +143,7 @@
|
|||||||
android:layout_width="304dp"
|
android:layout_width="304dp"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_gravity="start"
|
android:layout_gravity="start"
|
||||||
|
android:fitsSystemWindows="false"
|
||||||
/>
|
/>
|
||||||
</android.support.v4.widget.DrawerLayout>
|
</android.support.v4.widget.DrawerLayout>
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<RelativeLayout
|
<LinearLayout
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
android:id="@+id/content_main"
|
android:id="@+id/content_main"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical"
|
||||||
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
app:layout_behavior="@string/appbar_scrolling_view_behavior"
|
||||||
tools:context="com.stardust.scriptdroid.ui.main.MainActivity"
|
tools:context="com.stardust.scriptdroid.ui.main.MainActivity"
|
||||||
tools:showIn="@layout/activity_main">
|
tools:showIn="@layout/activity_main">
|
||||||
@@ -13,8 +14,8 @@
|
|||||||
<android.support.v4.view.ViewPager
|
<android.support.v4.view.ViewPager
|
||||||
android:id="@+id/viewpager"
|
android:id="@+id/viewpager"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1"
|
||||||
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
|
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
</RelativeLayout>
|
|
||||||
|
|||||||
197
app/src/main/res/layout/fragment_app_bar_tab.xml
Normal file
197
app/src/main/res/layout/fragment_app_bar_tab.xml
Normal file
@@ -0,0 +1,197 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:id="@+id/drawer_layout"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context="com.stardust.scriptdroid.ui.main.MainActivity">
|
||||||
|
|
||||||
|
|
||||||
|
<android.support.design.widget.CoordinatorLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/app_bar_bg"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="128.5dp"
|
||||||
|
android:scaleType="fitXY"
|
||||||
|
android:src="@drawable/toolbar_bg"/>
|
||||||
|
|
||||||
|
<android.support.design.widget.AppBarLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@android:color/transparent"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
android:paddingTop="24dp"
|
||||||
|
android:theme="@style/AppTheme.AppBarOverlay"
|
||||||
|
app:elevation="0dp">
|
||||||
|
|
||||||
|
|
||||||
|
<android.support.v7.widget.Toolbar
|
||||||
|
android:id="@+id/toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
android:title="@string/_app_name"
|
||||||
|
app:popupTheme="@style/AppTheme.PopupOverlay">
|
||||||
|
|
||||||
|
<ImageView
|
||||||
|
android:id="@+id/add"
|
||||||
|
android:layout_width="?android:attr/actionBarSize"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_gravity="right"
|
||||||
|
android:foreground="?selectableItemBackgroundBorderless"
|
||||||
|
android:padding="12dp"
|
||||||
|
android:src="@drawable/ic_add_white_48dp"/>
|
||||||
|
|
||||||
|
</android.support.v7.widget.Toolbar>
|
||||||
|
|
||||||
|
</android.support.design.widget.AppBarLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical"
|
||||||
|
app:layout_behavior="@string/appbar_scrolling_view_behavior">
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:id="@+id/content"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1"/>
|
||||||
|
|
||||||
|
<com.ashokvarma.bottomnavigation.BottomNavigationBar
|
||||||
|
android:id="@+id/bottom_navigation_bar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<com.stardust.widget.SlidingUpPanel
|
||||||
|
android:id="@+id/bottom_menu"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="160dp"
|
||||||
|
android:background="@android:color/white"
|
||||||
|
android:baselineAligned="false"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="horizontal">
|
||||||
|
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/create_new_file"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:background="?attr/selectableItemBackgroundBorderless"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<com.stardust.theme.widget.ThemeColorImageView
|
||||||
|
android:layout_width="60dp"
|
||||||
|
android:layout_height="60dp"
|
||||||
|
android:padding="10dp"
|
||||||
|
android:src="@drawable/ic_add_file_green"/>
|
||||||
|
|
||||||
|
<com.stardust.theme.widget.ThemeColorTextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/text_new_file"
|
||||||
|
android:textColor="@color/colorPrimary"
|
||||||
|
android:textSize="16sp"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/import_from_file"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:background="?attr/selectableItemBackgroundBorderless"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<com.stardust.theme.widget.ThemeColorImageView
|
||||||
|
android:layout_width="60dp"
|
||||||
|
android:layout_height="60dp"
|
||||||
|
android:padding="10dp"
|
||||||
|
android:src="@drawable/ic_folder_open_outline_green"/>
|
||||||
|
|
||||||
|
<com.stardust.theme.widget.ThemeColorTextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/text_import_from_file"
|
||||||
|
android:textColor="@color/colorPrimary"
|
||||||
|
android:textSize="16sp"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/record"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:background="?attr/selectableItemBackgroundBorderless"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:visibility="gone">
|
||||||
|
|
||||||
|
<com.stardust.theme.widget.ThemeColorImageView
|
||||||
|
android:layout_width="60dp"
|
||||||
|
android:layout_height="60dp"
|
||||||
|
android:padding="10dp"
|
||||||
|
android:src="@drawable/ic_video_record"/>
|
||||||
|
|
||||||
|
<com.stardust.theme.widget.ThemeColorTextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/text_script_record"
|
||||||
|
android:textColor="@color/colorPrimary"
|
||||||
|
android:textSize="16sp"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:id="@+id/root_record"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
android:background="?attr/selectableItemBackgroundBorderless"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:visibility="gone">
|
||||||
|
|
||||||
|
<com.stardust.theme.widget.ThemeColorImageView
|
||||||
|
android:layout_width="60dp"
|
||||||
|
android:layout_height="60dp"
|
||||||
|
android:padding="10dp"
|
||||||
|
android:src="@drawable/ic_video_record"/>
|
||||||
|
|
||||||
|
<com.stardust.theme.widget.ThemeColorTextView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center"
|
||||||
|
android:text="@string/text_root_script_record"
|
||||||
|
android:textColor="@color/colorPrimary"
|
||||||
|
android:textSize="16sp"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</com.stardust.widget.SlidingUpPanel>
|
||||||
|
|
||||||
|
</android.support.design.widget.CoordinatorLayout>
|
||||||
|
|
||||||
|
</android.support.v4.widget.DrawerLayout>
|
||||||
|
|
||||||
13
app/src/main/res/layout/fragment_manager.xml
Normal file
13
app/src/main/res/layout/fragment_manager.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<view
|
||||||
|
android:id="@+id/console"
|
||||||
|
class="com.stardust.scriptdroid.ui.console.ConsoleActivity$ConsoleView"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
37
app/src/main/res/layout/fragment_scripts.xml
Normal file
37
app/src/main/res/layout/fragment_scripts.xml
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<FrameLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:clipToPadding="false"
|
||||||
|
android:paddingBottom="10dp">
|
||||||
|
|
||||||
|
<android.support.design.widget.TabLayout
|
||||||
|
android:id="@+id/tab"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="48dp"
|
||||||
|
android:elevation="10dp"
|
||||||
|
app:elevation="10dp"
|
||||||
|
android:outlineProvider="bounds"
|
||||||
|
app:tabGravity="fill"
|
||||||
|
app:tabIndicatorColor="@color/colorAccent"
|
||||||
|
app:tabMode="fixed"
|
||||||
|
app:tabSelectedTextColor="@android:color/primary_text_dark"
|
||||||
|
app:tabTextColor="#c4c4c4"
|
||||||
|
tools:background="@color/colorPrimary"/>
|
||||||
|
</FrameLayout>
|
||||||
|
|
||||||
|
|
||||||
|
<android.support.v4.view.ViewPager
|
||||||
|
android:id="@+id/viewpager"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1"
|
||||||
|
app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
|
||||||
|
</LinearLayout>
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
<declare-styleable name="ToolbarMenuItem">
|
<declare-styleable name="ToolbarMenuItem">
|
||||||
<attr name="text" format="string|reference"/>
|
<attr name="text" format="string|reference"/>
|
||||||
<attr name="icon" format="reference"/>
|
<attr name="icon" format="reference"/>
|
||||||
|
|||||||
@@ -177,6 +177,9 @@
|
|||||||
<string name="key_single_thread">KEY_SINGLE_THREAD</string>
|
<string name="key_single_thread">KEY_SINGLE_THREAD</string>
|
||||||
<string name="text_on">已开启</string>
|
<string name="text_on">已开启</string>
|
||||||
<string name="text_off">已关闭</string>
|
<string name="text_off">已关闭</string>
|
||||||
|
<string name="text_script">脚本</string>
|
||||||
|
<string name="text_manage">管理</string>
|
||||||
|
<string name="text_task_manage">任务管理</string>
|
||||||
|
|
||||||
<string-array name="record_control_keys">
|
<string-array name="record_control_keys">
|
||||||
<item>无</item>
|
<item>无</item>
|
||||||
|
|||||||
@@ -2,15 +2,23 @@ package com.stardust.scriptdroid;
|
|||||||
|
|
||||||
import com.stardust.scriptdroid.droid.script.JavaScriptEngine;
|
import com.stardust.scriptdroid.droid.script.JavaScriptEngine;
|
||||||
import com.stardust.scriptdroid.droid.script.RhinoJavaScriptEngine;
|
import com.stardust.scriptdroid.droid.script.RhinoJavaScriptEngine;
|
||||||
|
import com.stardust.scriptdroid.droid.script.file.ScriptFile;
|
||||||
import com.stardust.scriptdroid.record.inputevent.InputEventToJsConverter;
|
import com.stardust.scriptdroid.record.inputevent.InputEventToJsConverter;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.mozilla.javascript.Context;
|
import org.mozilla.javascript.Context;
|
||||||
import org.mozilla.javascript.ImporterTopLevel;
|
import org.mozilla.javascript.ImporterTopLevel;
|
||||||
|
import org.mozilla.javascript.Scriptable;
|
||||||
|
import org.mozilla.javascript.commonjs.module.RequireBuilder;
|
||||||
|
import org.mozilla.javascript.commonjs.module.provider.SoftCachingModuleScriptProvider;
|
||||||
|
import org.mozilla.javascript.commonjs.module.provider.UrlModuleSourceProvider;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.lang.reflect.Array;
|
import java.lang.reflect.Array;
|
||||||
|
import java.net.URI;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
@@ -27,80 +35,63 @@ import static org.junit.Assert.assertEquals;
|
|||||||
*/
|
*/
|
||||||
public class ExampleUnitTest {
|
public class ExampleUnitTest {
|
||||||
// TODO: 2017/3/3 自定义函数
|
// TODO: 2017/3/3 自定义函数
|
||||||
// TODO: 2017/3/19
|
// TODO: 2017/3/19 exist函数
|
||||||
|
// TODO: 2017/3/23 tasker插件
|
||||||
|
// TODO: 2017/3/23 任务管理与控制台
|
||||||
|
// TODO: 2017/3/23 悬浮窗加入控制台
|
||||||
|
// TODO: 2017/3/24 文件读写api
|
||||||
|
// TODO: 2017/3/24 网络读写api
|
||||||
|
// TODO: 2017/3/24 常驻后台api
|
||||||
|
// TODO: 2017/3/24 ui。E4x
|
||||||
|
// TODO: 2017/3/24 编辑界面文档和自动补全
|
||||||
|
// TODO: 2017/3/24 驻留模式
|
||||||
|
|
||||||
|
|
||||||
|
// FIXME: 2017/3/23 死机重启问题
|
||||||
|
// FIXME: 2017/3/23 卡顿问题
|
||||||
|
|
||||||
Counter counter = new Counter(5);
|
|
||||||
private List<Integer> mIntegers = new ArrayList<>();
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test() {
|
public void test() {
|
||||||
ExecutorService executor = Executors.newFixedThreadPool(10);
|
|
||||||
executor.execute(new Task(1, 100));
|
List<URI> paths = Collections.singletonList(new File("D:/js/").toURI());
|
||||||
executor.execute(new Task(2, 1000));
|
Context ctx = Context.enter();
|
||||||
System.out.println(0);
|
ctx.setOptimizationLevel(-1);
|
||||||
executor.execute(new Task(3, 100));
|
ctx.setLanguageVersion(Context.VERSION_1_7);
|
||||||
executor.execute(new Task(4, 100));
|
ctx.setInstructionObserverThreshold(10000);
|
||||||
executor.execute(new Task(5, 100));
|
ImporterTopLevel scope = new ImporterTopLevel();
|
||||||
System.out.println(100);
|
scope.initStandardObjects(ctx, false);
|
||||||
counter.lock();
|
|
||||||
|
new RequireBuilder()
|
||||||
|
.setModuleScriptProvider(new SoftCachingModuleScriptProvider(
|
||||||
|
new UrlModuleSourceProvider(paths, null)))
|
||||||
|
.setSandboxed(true)
|
||||||
|
.createRequire(ctx, scope)
|
||||||
|
.install(scope);
|
||||||
|
|
||||||
|
|
||||||
|
ctx.evaluateString(scope, "require('test.js')()", "<test>", 1, null);
|
||||||
|
|
||||||
|
Context.exit();
|
||||||
}
|
}
|
||||||
|
|
||||||
private class Task implements Runnable {
|
@Test
|
||||||
|
public void test2(){
|
||||||
public Task(int i, int delay) {
|
Context context = Context.enter();
|
||||||
this.i = i;
|
context.setOptimizationLevel(-1);
|
||||||
this.delay = delay;
|
context.setLanguageVersion(Context.VERSION_1_7);
|
||||||
}
|
context.setInstructionObserverThreshold(10000);
|
||||||
|
ImporterTopLevel scope = new ImporterTopLevel();
|
||||||
private final int i, delay;
|
scope.initStandardObjects(context, false);
|
||||||
|
List<URI> paths = Collections.singletonList(new File("D:/js/").toURI());
|
||||||
@Override
|
new RequireBuilder()
|
||||||
public void run() {
|
.setModuleScriptProvider(new SoftCachingModuleScriptProvider(
|
||||||
if (delay > 0)
|
new UrlModuleSourceProvider(paths, null)))
|
||||||
try {
|
.setSandboxed(true)
|
||||||
Thread.sleep(delay);
|
.createRequire(context, scope)
|
||||||
} catch (InterruptedException e) {
|
.install(scope);
|
||||||
throw new RuntimeException(e);
|
context.evaluateString(scope, "require('test.js')()", "<test>", 1, null);
|
||||||
}
|
|
||||||
System.out.println(i);
|
|
||||||
synchronized (mIntegers) {
|
|
||||||
mIntegers.add(i);
|
|
||||||
for (Integer integer : mIntegers) {
|
|
||||||
System.out.println(i + ":" + integer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
counter.minus();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static class Counter {
|
|
||||||
|
|
||||||
private final Object lock = new Object();
|
|
||||||
|
|
||||||
public Counter(int i) {
|
|
||||||
this.i = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
private volatile int i;
|
|
||||||
|
|
||||||
void minus() {
|
|
||||||
i--;
|
|
||||||
if (i == 0) {
|
|
||||||
synchronized (lock) {
|
|
||||||
lock.notify();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void lock() {
|
|
||||||
synchronized (lock) {
|
|
||||||
try {
|
|
||||||
lock.wait();
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
Context.exit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package com.stardust.view.accessibility;
|
||||||
|
|
||||||
|
import android.view.accessibility.AccessibilityNodeInfo;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Stardust on 2017/3/22.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class AccessibilityAllocator {
|
||||||
|
|
||||||
|
|
||||||
|
private List<AccessibilityNodeInfo> mAccessibilityNodeInfoList = new Vector<>();
|
||||||
|
|
||||||
|
public AccessibilityNodeInfo getChild(AccessibilityNodeInfo parent, int i) {
|
||||||
|
return add(parent.getChild(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
private AccessibilityNodeInfo add(AccessibilityNodeInfo nodeInfo) {
|
||||||
|
mAccessibilityNodeInfoList.add(nodeInfo);
|
||||||
|
return nodeInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int recycleAll() {
|
||||||
|
int recycled = 0;
|
||||||
|
for (AccessibilityNodeInfo nodeInfo : mAccessibilityNodeInfoList) {
|
||||||
|
try {
|
||||||
|
nodeInfo.recycle();
|
||||||
|
recycled++;
|
||||||
|
} catch (IllegalStateException ignored) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return recycled;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user