add: manager tab

This commit is contained in:
hyb1996
2017-08-23 12:17:05 +08:00
parent 42f6802598
commit 16d48bd6b5
22 changed files with 464 additions and 249 deletions

View File

@@ -39,33 +39,4 @@ public class LogActivity extends BaseActivity {
return super.onOptionsItemSelected(item);
}
public static class ConsoleView extends Console {
public ConsoleView(Context context) {
super(context);
init();
}
public ConsoleView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ConsoleView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public ConsoleView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
private void init() {
findViewById(R.id.console_scroll_view).setBackgroundColor(Color.WHITE);
((TextView) findViewById(R.id.console_text)).setTextIsSelectable(true);
}
}
}

View File

@@ -0,0 +1,41 @@
package com.stardust.scriptdroid.ui.console;
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.widget.TextView;
import com.jraska.console.Console;
import com.stardust.scriptdroid.R;
/**
* Created by Stardust on 2017/8/22.
*/
public class LogView extends Console {
public LogView(Context context) {
super(context);
init();
}
public LogView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public LogView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public LogView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
private void init() {
findViewById(R.id.console_scroll_view).setBackgroundColor(Color.WHITE);
((TextView) findViewById(R.id.console_text)).setTextIsSelectable(true);
}
}

View File

@@ -6,7 +6,9 @@ import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
@@ -33,7 +35,6 @@ import com.stardust.scriptdroid.script.ScriptFile;
import com.stardust.scriptdroid.script.StorageFileProvider;
import com.stardust.scriptdroid.ui.common.ScriptOperations;
import com.stardust.scriptdroid.ui.main.community.CommunityFragment;
import com.stardust.scriptdroid.ui.main.doc.OnlineDocsFragment;
import com.stardust.scriptdroid.ui.main.doc.OnlineDocsFragment_;
import com.stardust.scriptdroid.ui.main.script_list.MyScriptListFragment_;
import com.stardust.scriptdroid.ui.main.task.TaskManagerFragment_;
@@ -41,8 +42,6 @@ import com.stardust.util.DeveloperUtils;
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
import com.stardust.scriptdroid.tool.DrawableSaver;
import com.stardust.scriptdroid.ui.BaseActivity;
import com.stardust.scriptdroid.ui.main.sample_list.SampleScriptListFragment;
import com.stardust.scriptdroid.ui.main.script_list.MyScriptListFragment;
import com.stardust.scriptdroid.ui.main.script_list.ScriptFileChooserDialogBuilder;
import com.stardust.scriptdroid.ui.settings.SettingsActivity_;
import com.stardust.scriptdroid.ui.update.VersionGuard;
@@ -72,8 +71,10 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
SlidingUpPanel mAddBottomMenuPanel;
@ViewById(R.id.viewpager)
ViewPager mViewPager;
private FragmentPagerAdapterBuilder.StoredFragmentPagerAdapter mPagerAdapter;
@ViewById(R.id.fab)
FloatingActionButton mFab;
private FragmentPagerAdapterBuilder.StoredFragmentPagerAdapter mPagerAdapter;
private OnActivityResultDelegate.Mediator mActivityResultMediator = new OnActivityResultDelegate.Mediator();
private DrawableSaver mDrawerHeaderBackgroundSaver;
private VersionGuard mVersionGuard;
@@ -182,6 +183,15 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
.build();
mViewPager.setAdapter(mPagerAdapter);
tabLayout.setupWithViewPager(mViewPager);
mViewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
Fragment fragment = mPagerAdapter.getStoredFragment(position);
if (fragment == null)
return;
((ViewPagerFragment) fragment).setUpWithFab(mViewPager, mFab);
}
});
}
@Click(R.id.create_new_file)

View File

@@ -0,0 +1,14 @@
package com.stardust.scriptdroid.ui.main;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.view.ViewPager;
/**
* Created by Stardust on 2017/8/22.
*/
public interface ViewPagerFragment {
void setUpWithFab(ViewPager pager, FloatingActionButton fab);
}

View File

@@ -1,10 +1,29 @@
package com.stardust.scriptdroid.ui.main.community;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v4.view.animation.FastOutSlowInInterpolator;
import android.view.View;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.ui.main.ViewPagerFragment;
/**
* Created by Stardust on 2017/8/22.
*/
public class CommunityFragment extends Fragment {
public class CommunityFragment extends Fragment implements ViewPagerFragment {
@Override
public void setUpWithFab(ViewPager pager, FloatingActionButton fab) {
if (fab.getVisibility() != View.VISIBLE) {
fab.show();
return;
}
fab.animate()
.rotation(0)
.setDuration(300)
.setInterpolator(new FastOutSlowInInterpolator())
.start();
}
}

View File

@@ -2,10 +2,14 @@ package com.stardust.scriptdroid.ui.main.doc;
import android.app.Activity;
import android.content.Context;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.webkit.WebView;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.ui.main.ViewPagerFragment;
import com.stardust.util.BackPressedHandler;
import com.stardust.widget.EWebView;
@@ -17,7 +21,7 @@ import org.androidannotations.annotations.ViewById;
* Created by Stardust on 2017/8/22.
*/
@EFragment(R.layout.fragment_online_docs)
public class OnlineDocsFragment extends Fragment implements BackPressedHandler {
public class OnlineDocsFragment extends Fragment implements BackPressedHandler, ViewPagerFragment {
@ViewById(R.id.eweb_view)
EWebView mEWebView;
@@ -53,4 +57,11 @@ public class OnlineDocsFragment extends Fragment implements BackPressedHandler {
}
return false;
}
@Override
public void setUpWithFab(ViewPager pager, FloatingActionButton fab) {
if (fab.getVisibility() == View.VISIBLE) {
fab.hide();
}
}
}

View File

@@ -1,8 +1,11 @@
package com.stardust.scriptdroid.ui.main.script_list;
import android.support.annotation.NonNull;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v4.view.animation.FastOutSlowInInterpolator;
import android.view.View;
import com.afollestad.materialdialogs.DialogAction;
@@ -14,6 +17,7 @@ import com.stardust.scriptdroid.script.Scripts;
import com.stardust.scriptdroid.script.StorageFileProvider;
import com.stardust.scriptdroid.ui.common.ScriptLoopDialog;
import com.stardust.scriptdroid.ui.edit.ScriptEditView;
import com.stardust.scriptdroid.ui.main.ViewPagerFragment;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EFragment;
@@ -32,7 +36,7 @@ import io.reactivex.schedulers.Schedulers;
* Created by Stardust on 2017/3/13.
*/
@EFragment(R.layout.fragment_my_script_list)
public class MyScriptListFragment extends Fragment {
public class MyScriptListFragment extends Fragment implements ViewPagerFragment {
private static final String TAG = "MyScriptListFragment";
@@ -140,4 +144,16 @@ public class MyScriptListFragment extends Fragment {
}
@Override
public void setUpWithFab(ViewPager pager, FloatingActionButton fab) {
if (fab.getVisibility() != View.VISIBLE) {
fab.show();
return;
}
fab.animate()
.rotation(0)
.setDuration(300)
.setInterpolator(new FastOutSlowInInterpolator())
.start();
}
}

View File

@@ -12,6 +12,7 @@ import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.stardust.autojs.script.AutoFileSource;
import com.stardust.pio.PFile;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.script.ScriptFile;
@@ -178,7 +179,7 @@ public class ScriptListView extends SwipeRefreshLayout implements SwipeRefreshLa
}
}
class ScriptFileViewHolder extends BindableViewHolder<ScriptFile> {
class ScriptFileViewHolder extends BindableViewHolder<ScriptFile> {
@BindView(R.id.name)
@@ -203,17 +204,16 @@ public class ScriptListView extends SwipeRefreshLayout implements SwipeRefreshLa
mDesc.setText(PFile.getHumanReadableSize(file.length()));
if (file.getType() == ScriptFile.TYPE_JAVA_SCRIPT) {
mFirstChar.setText("J");
//什么?裸写颜色代码?!不影响代码可读性和重构成本的情况下,这样子修改起来方便多啦
mFirstCharBackground.setColor(0xFF99CC99);
mFirstCharBackground.setColor(getResources().getColor(R.color.color_j));
} else {
mFirstChar.setText("R");
mFirstCharBackground.setColor(0xFFFD999A);
mFirstCharBackground.setColor(getResources().getColor(R.color.color_r));
}
}
@OnClick(R.id.item)
void onItemClick() {
if(mOnScriptFileClickListener != null){
if (mOnScriptFileClickListener != null) {
mOnScriptFileClickListener.onScriptFileClick(itemView, mScriptFile);
}
}

View File

@@ -1,6 +1,7 @@
package com.stardust.scriptdroid.ui.main.task;
import android.content.Context;
import android.graphics.drawable.GradientDrawable;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.ThemeColorRecyclerView;
@@ -8,28 +9,28 @@ import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.workground.WrapContentLinearLayoutManager;
import com.stardust.autojs.ScriptEngineService;
import com.stardust.autojs.engine.JavaScriptEngine;
import com.stardust.autojs.engine.ScriptEngineManager;
import com.stardust.autojs.execution.ScriptExecution;
import com.stardust.autojs.execution.ScriptExecutionListener;
import com.stardust.autojs.execution.SimpleScriptExecutionListener;
import com.stardust.autojs.engine.ScriptEngine;
import com.stardust.autojs.script.AutoFileSource;
import com.stardust.autojs.script.JavaScriptSource;
import com.stardust.autojs.script.ScriptSource;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.script.ScriptFile;
import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration;
import java.util.ArrayList;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
/**
* Created by Stardust on 2017/3/24.
*/
@@ -44,29 +45,6 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView implements Scri
}
};
private final OnClickListener mOnStopClickListener = new OnClickListener() {
@Override
public void onClick(View v) {
int position = getChildViewHolder((View) v.getParent()).getAdapterPosition();
if (position >= 0) {
final ScriptEngine engine = mScriptEngines.get(position);
engine.forceStop();
postDelayed(new Runnable() {
@Override
public void run() {
if (!engine.isDestroyed()) {
onScriptANR(engine);
}
}
}, 3000);
} else {
updateEngineList();
}
}
};
private final List<ScriptEngine> mScriptEngines = new ArrayList<>();
private Adapter mAdapter;
private final ScriptEngineService mScriptEngineService = AutoJs.getInstance().getScriptEngineService();
@@ -106,7 +84,7 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView implements Scri
private void init() {
setLayoutManager(new WrapContentLinearLayoutManager(getContext()));
addItemDecoration(new HorizontalDividerItemDecoration.Builder(getContext())
.color(0xffd9d9d9)
.color(0xffEDEEEF)
.size(2)
.marginResId(R.dimen.script_and_folder_list_divider_left_margin, R.dimen.script_and_folder_list_divider_right_margin)
.showLastDivider()
@@ -186,7 +164,9 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView implements Scri
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.bind((ScriptSource) mScriptEngines.get(position).getTag(ScriptEngine.TAG_SOURCE));
ScriptEngine engine = mScriptEngines.get(position);
ScriptSource source = (ScriptSource) mScriptEngines.get(position).getTag(ScriptEngine.TAG_SOURCE);
holder.bind(source, engine);
}
@Override
@@ -195,30 +175,46 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView implements Scri
}
}
private class ViewHolder extends RecyclerView.ViewHolder {
class ViewHolder extends RecyclerView.ViewHolder {
ImageView icon;
TextView name, detail;
View stop;
@BindView(R.id.first_char)
TextView mFirstChar;
@BindView(R.id.name)
TextView mName;
@BindView(R.id.desc)
TextView mDesc;
private ScriptEngine mScriptEngine;
private GradientDrawable mFirstCharBackground;
ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(mOnItemClickListenerProxy);
name = (TextView) itemView.findViewById(R.id.name);
detail = (TextView) itemView.findViewById(R.id.detail);
icon = (ImageView) itemView.findViewById(R.id.icon);
stop = itemView.findViewById(R.id.stop);
stop.setOnClickListener(mOnStopClickListener);
ButterKnife.bind(this, itemView);
mFirstCharBackground = (GradientDrawable) mFirstChar.getBackground();
}
public void bind(ScriptSource source) {
public void bind(ScriptSource source, ScriptEngine engine) {
mScriptEngine = engine;
if (source == null)
return;
name.setText(source.getName());
detail.setText(source.toString());
mName.setText(source.getName());
mDesc.setText(source.toString());
//ignore android studio warning: use equals to compare string
icon.setImageResource(source.getEngineName() == AutoFileSource.ENGINE ? R.drawable.record_icon_18
: R.drawable.ic_node_js_black);
if (source.getEngineName() == AutoFileSource.ENGINE) {
mFirstChar.setText("R");
mFirstCharBackground.setColor(getResources().getColor(R.color.color_r));
} else {
mFirstChar.setText("J");
mFirstCharBackground.setColor(getResources().getColor(R.color.color_j));
}
}
@OnClick(R.id.stop)
void stop() {
if (mScriptEngine != null) {
mScriptEngine.forceStop();
}
}
}

View File

@@ -1,11 +1,25 @@
package com.stardust.scriptdroid.ui.main.task;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewPager;
import android.support.v4.view.animation.FastOutSlowInInterpolator;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.MenuItem;
import android.view.View;
import android.widget.PopupMenu;
import android.widget.TextView;
import android.widget.ViewAnimator;
import com.jraska.console.Console;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.ui.console.LogView;
import com.stardust.scriptdroid.ui.main.ViewPagerFragment;
import com.stardust.widget.SimpleAdapterDataObserver;
import org.androidannotations.annotations.AfterViews;
@@ -13,27 +27,54 @@ import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EFragment;
import org.androidannotations.annotations.ViewById;
import butterknife.OnClick;
/**
* Created by Stardust on 2017/3/24.
*/
@EFragment(R.layout.fragment_task_manager)
public class TaskManagerFragment extends Fragment {
public class TaskManagerFragment extends Fragment implements PopupMenu.OnMenuItemClickListener, ViewPagerFragment {
@ViewById(R.id.task_list)
TaskListRecyclerView mTaskListRecyclerView;
@ViewById(R.id.close_all)
View mCloseAllView;
@ViewById(R.id.notice_no_running_script)
View mNoRunningScriptNotice;
@ViewById(R.id.swipe_refresh_layout)
SwipeRefreshLayout mSwipeRefreshLayout;
@ViewById(R.id.task_manager_view)
View mTaskManagerView;
@ViewById(R.id.log)
View mLogView;
@ViewById(R.id.spinner)
View mSpinner;
@ViewById(R.id.spinner_current_item)
TextView mSpinnerCurrentItem;
private FloatingActionButton mFab;
private View.OnClickListener mOnFabClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mLogView.getVisibility() == View.VISIBLE) {
Console.clear();
} else {
AutoJs.getInstance().getScriptEngineService().stopAll();
}
}
};
@AfterViews
void setUpViews() {
init();
final boolean noRunningScript = mTaskListRecyclerView.getAdapter().getItemCount() == 0;
mNoRunningScriptNotice.setVisibility(noRunningScript ? View.VISIBLE : View.GONE);
mCloseAllView.setVisibility(noRunningScript ? View.GONE : View.VISIBLE);
}
private void init() {
@@ -48,7 +89,6 @@ public class TaskManagerFragment extends Fragment {
if (mNoRunningScriptNotice == null)
return;
mNoRunningScriptNotice.setVisibility(noRunningScript ? View.VISIBLE : View.GONE);
mCloseAllView.setVisibility(noRunningScript ? View.GONE : View.VISIBLE);
}
}, 150);
}
@@ -69,8 +109,66 @@ public class TaskManagerFragment extends Fragment {
});
}
@Click(R.id.close_all)
void closeAllRunningScripts() {
AutoJs.getInstance().getScriptEngineService().stopAll();
@Click(R.id.spinner)
void showPopupMenu() {
PopupMenu popupMenu = new PopupMenu(getContext(), mSpinner);
popupMenu.inflate(R.menu.menu_manager);
popupMenu.show();
popupMenu.setOnMenuItemClickListener(this);
}
@Override
public boolean onMenuItemClick(MenuItem item) {
int id = item.getItemId();
if (id == R.id.task_manage) {
showTaskManager();
} else {
showLog();
}
return true;
}
private void showLog() {
mTaskManagerView.setVisibility(View.GONE);
mLogView.setVisibility(View.VISIBLE);
mSpinnerCurrentItem.setText(R.string.text_log);
}
private void showTaskManager() {
mLogView.setVisibility(View.GONE);
mTaskManagerView.setVisibility(View.VISIBLE);
mSpinnerCurrentItem.setText(R.string.text_task_manage);
}
@Override
public void setUpWithFab(ViewPager pager, final FloatingActionButton fab) {
mFab = fab;
fab.setOnClickListener(mOnFabClickListener);
if (fab.getVisibility() != View.VISIBLE) {
fab.show();
return;
}
fab.animate()
.rotation(45)
.setDuration(300)
.setInterpolator(new FastOutSlowInInterpolator())
.start();
}
@Override
public void onPause() {
super.onPause();
if (mFab != null) {
mFab.setOnClickListener(null);
}
}
@Override
public void onResume() {
super.onResume();
if (mFab != null) {
mFab.setOnClickListener(mOnFabClickListener);
}
}
}