From 98b3fb2c0994f1308af0537f8079e91de3c9470e Mon Sep 17 00:00:00 2001
From: hyb1996 <946994919@qq.com>
Date: Wed, 25 Oct 2017 16:43:55 +0800
Subject: [PATCH] add: custom shortcut icon
---
app/src/main/AndroidManifest.xml | 4 +
.../external/open/ImportIntentActivity.java | 16 +-
.../external/shortcut/Shortcut.java | 8 +-
.../stardust/scriptdroid/tool/BitmapTool.java | 54 ++-----
.../ui/common/ScriptOperations.java | 13 +-
.../scriptdroid/ui/main/MainActivity.java | 19 +--
.../scriptdroid/ui/main/QueryEvent.java | 10 ++
.../ui/main/community/CommunityFragment.java | 1 +
.../ui/main/scripts/ScriptListView.java | 5 +
.../ui/shortcut/ShortcutCreateActivity.java | 122 +++++++++++++++
.../shortcut/ShortcutIconSelectActivity.java | 140 ++++++++++++++++++
.../com/stardust/widget/SearchViewItem.java | 6 +
.../ic_insert_photo_white_48dp.png | Bin 0 -> 1725 bytes
.../shortcut_create_dialog_icon_bg.xml | 8 +
.../layout/activity_shortcut_icon_select.xml | 32 ++++
.../main/res/layout/app_icon_list_item.xml | 8 +
.../res/layout/shortcut_create_dialog.xml | 31 ++++
app/src/main/res/menu/menu_script_options.xml | 3 +
.../res/menu/menu_shortcut_icon_select.xml | 10 ++
app/src/main/res/values/strings.xml | 4 +-
20 files changed, 417 insertions(+), 77 deletions(-)
create mode 100644 app/src/main/java/com/stardust/scriptdroid/ui/shortcut/ShortcutCreateActivity.java
create mode 100644 app/src/main/java/com/stardust/scriptdroid/ui/shortcut/ShortcutIconSelectActivity.java
create mode 100644 app/src/main/res/drawable-xhdpi/ic_insert_photo_white_48dp.png
create mode 100644 app/src/main/res/drawable/shortcut_create_dialog_icon_bg.xml
create mode 100644 app/src/main/res/layout/activity_shortcut_icon_select.xml
create mode 100644 app/src/main/res/layout/app_icon_list_item.xml
create mode 100644 app/src/main/res/layout/shortcut_create_dialog.xml
create mode 100644 app/src/main/res/menu/menu_shortcut_icon_select.xml
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 965a730e..a6e3c69c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -81,6 +81,10 @@
+
+
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/open/ImportIntentActivity.java b/app/src/main/java/com/stardust/scriptdroid/external/open/ImportIntentActivity.java
index a1c0b699..f5bbf31a 100644
--- a/app/src/main/java/com/stardust/scriptdroid/external/open/ImportIntentActivity.java
+++ b/app/src/main/java/com/stardust/scriptdroid/external/open/ImportIntentActivity.java
@@ -45,29 +45,19 @@ public class ImportIntentActivity extends BaseActivity {
Uri uri = intent.getData();
if (uri != null && "content".equals(uri.getScheme())) {
String ext = PFiles.getExtension(uri.getScheme());
- if(TextUtils.isEmpty(ext)){
+ if (TextUtils.isEmpty(ext)) {
ext = "js";
}
InputStream stream = getContentResolver().openInputStream(uri);
new ScriptOperations(this, null)
.importFile("", stream, ext)
- .subscribe(new Consumer() {
- @Override
- public void accept(@NonNull String s) throws Exception {
- finish();
- }
- });
+ .subscribe(s -> finish());
} else {
final String path = intent.getData().getPath();
if (!TextUtils.isEmpty(path)) {
new ScriptOperations(this, null)
.importFile(path)
- .subscribe(new Consumer() {
- @Override
- public void accept(@NonNull String s) throws Exception {
- finish();
- }
- });
+ .subscribe(s -> finish());
}
}
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/external/shortcut/Shortcut.java b/app/src/main/java/com/stardust/scriptdroid/external/shortcut/Shortcut.java
index 9087b4aa..e674a4ec 100644
--- a/app/src/main/java/com/stardust/scriptdroid/external/shortcut/Shortcut.java
+++ b/app/src/main/java/com/stardust/scriptdroid/external/shortcut/Shortcut.java
@@ -5,6 +5,8 @@ import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
+import com.stardust.scriptdroid.tool.BitmapTool;
+
/**
* Created by Stardust on 2017/1/20.
*/
@@ -68,7 +70,11 @@ public class Shortcut {
if (mIconRes != null) {
throw new IllegalStateException("Cannot set both iconRes and icon");
}
- mIcon = icon;
+ if (icon.getByteCount() > 1024 * 100) {
+ mIcon = BitmapTool.scaleBitmap(icon, 100, 100);
+ }else {
+ mIcon = icon;
+ }
return this;
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/tool/BitmapTool.java b/app/src/main/java/com/stardust/scriptdroid/tool/BitmapTool.java
index 2df02e28..f8673aaa 100644
--- a/app/src/main/java/com/stardust/scriptdroid/tool/BitmapTool.java
+++ b/app/src/main/java/com/stardust/scriptdroid/tool/BitmapTool.java
@@ -1,7 +1,10 @@
package com.stardust.scriptdroid.tool;
import android.graphics.Bitmap;
+import android.graphics.Canvas;
import android.graphics.Matrix;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
/**
* Created by Stardust on 2017/4/22.
@@ -22,50 +25,15 @@ public class BitmapTool {
return Bitmap.createBitmap(origin, 0, 0, width, height, matrix, false);
}
- /*
-
- public static MatOfDMatch matchesBitmaps(Bitmap bitmap1, Bitmap bitmap2) {
- FeatureDetector detector = FeatureDetector.create(FeatureDetector.BRISK);
- DescriptorExtractor descriptor = DescriptorExtractor.create(DescriptorExtractor.ORB);
- DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);
- Mat descriptors1 = computeDescriptors(bitmap1, detector, descriptor);
- Mat descriptors2 = computeDescriptors(bitmap2, detector, descriptor);
- MatOfDMatch matches = new MatOfDMatch();
- matcher.match(descriptors1, descriptors2, matches);
- return matches;
+ public static Bitmap drawableToBitmap(Drawable drawable) {
+ if (drawable instanceof BitmapDrawable) {
+ return ((BitmapDrawable) drawable).getBitmap();
+ }
+ Bitmap b = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
+ Canvas c = new Canvas(b);
+ drawable.draw(c);
+ return b;
}
- private static Mat computeDescriptors(Bitmap bitmap, FeatureDetector detector, DescriptorExtractor descriptor) {
- Mat mat = bitmapToMat(bitmap.copy(bitmap.getConfig(), true));
- Mat descriptors = new Mat();
- MatOfKeyPoint keyPoints1 = new MatOfKeyPoint();
- detector.detect(mat, keyPoints1);
- descriptor.compute(mat, keyPoints1, descriptors);
- return descriptors;
- }
- private static Mat bitmapToMat(Bitmap bmp) {
- Mat mat = new Mat(bmp.getWidth(), bmp.getHeight(), CvType.CV_8UC1);
- Utils.bitmapToMat(bmp, mat);
- return mat;
- }
-
- public static Core.MinMaxLocResult templateMatching(Bitmap bitmap, Bitmap tmp, int matchMethod) {
- Mat img = bitmapToMat(bitmap);
- Mat template = bitmapToMat(tmp);
-
- // / Create the result matrix
- int result_cols = img.cols() - template.cols() + 1;
- int result_rows = img.rows() - template.rows() + 1;
- Mat result = new Mat(result_rows, result_cols, CvType.CV_32FC1);
-
- // / Do the Matching and Normalize
- Imgproc.matchTemplate(img, template, result, matchMethod);
- Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat());
-
- // / Localizing the best match with minMaxLoc
- Core.MinMaxLocResult mmr = Core.minMaxLoc(result);
- return mmr;
- }
- */
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/common/ScriptOperations.java b/app/src/main/java/com/stardust/scriptdroid/ui/common/ScriptOperations.java
index d9d32c71..f75754b6 100644
--- a/app/src/main/java/com/stardust/scriptdroid/ui/common/ScriptOperations.java
+++ b/app/src/main/java/com/stardust/scriptdroid/ui/common/ScriptOperations.java
@@ -1,6 +1,7 @@
package com.stardust.scriptdroid.ui.common;
import android.content.Context;
+import android.content.Intent;
import android.os.Environment;
import android.os.Looper;
import android.support.annotation.NonNull;
@@ -27,6 +28,7 @@ import com.stardust.scriptdroid.io.StorageFileProvider;
import com.stardust.scriptdroid.model.sample.Sample;
import com.stardust.scriptdroid.network.download.DownloadManager;
import com.stardust.scriptdroid.ui.filechooser.FileChooserDialogBuilder;
+import com.stardust.scriptdroid.ui.shortcut.ShortcutCreateActivity;
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
import org.reactivestreams.Publisher;
@@ -102,12 +104,7 @@ public class ScriptOperations {
public void newScriptFile() {
showFileNameInputDialog("", "js")
- .subscribe(new Consumer() {
- @Override
- public void accept(@io.reactivex.annotations.NonNull String input) throws Exception {
- createScriptFile(getCurrentDirectoryPath() + input + ".js", null, true);
- }
- });
+ .subscribe(input -> createScriptFile(getCurrentDirectoryPath() + input + ".js", null, true));
}
public Observable importFile(final String pathFrom) {
@@ -235,8 +232,8 @@ public class ScriptOperations {
}
public void createShortcut(ScriptFile file) {
- Scripts.createShortcut(file);
- showMessage(R.string.text_already_create);
+ mContext.startActivity(new Intent(mContext, ShortcutCreateActivity.class)
+ .putExtra(ShortcutCreateActivity.EXTRA_FILE, file));
}
public void delete(final ScriptFile scriptFile) {
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java
index 6838cc9c..40645bb7 100644
--- a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java
+++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java
@@ -1,22 +1,16 @@
package com.stardust.scriptdroid.ui.main;
import android.Manifest;
-import android.app.SearchManager;
-import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
-import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.TabLayout;
import android.support.v4.app.Fragment;
-import android.support.v4.view.MenuItemCompat;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
-import android.support.v7.widget.SearchView;
import android.support.v7.widget.Toolbar;
import android.view.Gravity;
import android.view.Menu;
@@ -27,14 +21,12 @@ import com.qq.e.comm.DownloadService;
import com.stardust.app.FragmentPagerAdapterBuilder;
import com.stardust.app.OnActivityResultDelegate;
import com.stardust.enhancedfloaty.FloatyService;
-import com.stardust.pio.PFile;
import com.stardust.pio.PFiles;
import com.stardust.scriptdroid.BuildConfig;
import com.stardust.scriptdroid.Pref;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.ui.common.NotAskAgainDialog;
-import com.stardust.scriptdroid.ui.common.ScriptOperations;
import com.stardust.scriptdroid.ui.doc.OnlineDocsFragment_;
import com.stardust.scriptdroid.ui.floating.FloatyWindowManger;
import com.stardust.scriptdroid.io.StorageFileProvider;
@@ -78,6 +70,7 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
private OnActivityResultDelegate.Mediator mActivityResultMediator = new OnActivityResultDelegate.Mediator();
private VersionGuard mVersionGuard;
private BackPressedHandler.Observer mBackPressObserver = new BackPressedHandler.Observer();
+ private SearchViewItem mSearchViewItem;
@Override
@@ -263,8 +256,8 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
}
private void setUpSearchMenuItem(MenuItem searchMenuItem) {
- SearchViewItem searchViewItem = new SearchViewItem(this, searchMenuItem);
- searchViewItem.setQueryCallback(this::submitQuery);
+ mSearchViewItem = new SearchViewItem(this, searchMenuItem);
+ mSearchViewItem.setQueryCallback(this::submitQuery);
}
private void submitQuery(String query) {
@@ -272,7 +265,11 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
EventBus.getDefault().post(QueryEvent.CLEAR);
return;
}
- EventBus.getDefault().post(new QueryEvent(query));
+ QueryEvent event = new QueryEvent(query);
+ EventBus.getDefault().post(event);
+ if (event.shouldCollapseSearchView()) {
+ mSearchViewItem.collapse();
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/QueryEvent.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/QueryEvent.java
index 7667b6bd..c27d0286 100644
--- a/app/src/main/java/com/stardust/scriptdroid/ui/main/QueryEvent.java
+++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/QueryEvent.java
@@ -8,6 +8,7 @@ public class QueryEvent {
public static final QueryEvent CLEAR = new QueryEvent(null);
+ private boolean mShouldCollapseSearchView = false;
private final String mQuery;
public QueryEvent(String query) {
@@ -17,4 +18,13 @@ public class QueryEvent {
public String getQuery() {
return mQuery;
}
+
+ public void collapseSearchView() {
+ mShouldCollapseSearchView = true;
+ }
+
+ public boolean shouldCollapseSearchView() {
+ return mShouldCollapseSearchView;
+ }
}
+
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/community/CommunityFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/community/CommunityFragment.java
index 2669e770..565f6f55 100644
--- a/app/src/main/java/com/stardust/scriptdroid/ui/main/community/CommunityFragment.java
+++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/community/CommunityFragment.java
@@ -104,6 +104,7 @@ public class CommunityFragment extends ViewPagerFragment implements BackPressedH
String query = URLEncoder.encode(event.getQuery());
String url = String.format("http://www.autojs.org/search?term=%s&in=titlesposts", query);
mWebView.loadUrl(url);
+ event.collapseSearchView();
}
private boolean isInPostsPage() {
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/scripts/ScriptListView.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/scripts/ScriptListView.java
index 79168b75..eb1eb031 100644
--- a/app/src/main/java/com/stardust/scriptdroid/ui/main/scripts/ScriptListView.java
+++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/scripts/ScriptListView.java
@@ -25,6 +25,7 @@ import com.stardust.scriptdroid.model.script.Scripts;
import com.stardust.scriptdroid.io.StorageFileProvider;
import com.stardust.scriptdroid.ui.common.ScriptLoopDialog;
import com.stardust.scriptdroid.ui.common.ScriptOperations;
+import com.stardust.scriptdroid.ui.floating.EditorFloaty;
import com.stardust.scriptdroid.ui.viewmodel.ScriptList;
import com.stardust.widget.BindableViewHolder;
@@ -217,6 +218,10 @@ public class ScriptListView extends SwipeRefreshLayout implements SwipeRefreshLa
.show();
notifyOperated();
break;
+ case R.id.floating_edit:
+ EditorFloaty.floatingEdit(getContext(), mSelectedScriptFile);
+ notifyOperated();
+ break;
case R.id.create_shortcut:
new ScriptOperations(getContext(), this)
.createShortcut(mSelectedScriptFile);
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/shortcut/ShortcutCreateActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/shortcut/ShortcutCreateActivity.java
new file mode 100644
index 00000000..3e62fec4
--- /dev/null
+++ b/app/src/main/java/com/stardust/scriptdroid/ui/shortcut/ShortcutCreateActivity.java
@@ -0,0 +1,122 @@
+package com.stardust.scriptdroid.ui.shortcut;
+
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v7.app.AppCompatActivity;
+import android.util.Log;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.afollestad.materialdialogs.MaterialDialog;
+import com.stardust.scriptdroid.R;
+import com.stardust.scriptdroid.external.CommonUtils;
+import com.stardust.scriptdroid.external.shortcut.Shortcut;
+import com.stardust.scriptdroid.external.shortcut.ShortcutActivity;
+import com.stardust.scriptdroid.model.script.ScriptFile;
+import com.stardust.scriptdroid.tool.BitmapTool;
+import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
+import com.stardust.theme.internal.DrawableTool;
+
+import java.io.FileNotFoundException;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * Created by Stardust on 2017/10/25.
+ */
+
+public class ShortcutCreateActivity extends AppCompatActivity {
+
+ public static final String EXTRA_FILE = "file";
+ private static final String LOG_TAG = "ShortcutCreateActivity";
+ private ScriptFile mScriptFile;
+ private boolean mIsDefaultIcon = true;
+
+ @BindView(R.id.name)
+ TextView mName;
+
+ @BindView(R.id.select_icon)
+ ImageView mIcon;
+
+ @Override
+ protected void onCreate(@Nullable Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mScriptFile = (ScriptFile) getIntent().getSerializableExtra(EXTRA_FILE);
+ showDialog();
+ }
+
+ private void showDialog() {
+ View view = View.inflate(this, R.layout.shortcut_create_dialog, null);
+ ButterKnife.bind(this, view);
+ mName.setText(mScriptFile.getSimplifiedName());
+ new ThemeColorMaterialDialogBuilder(this)
+ .customView(view, false)
+ .title(R.string.text_send_shortcut)
+ .positiveText(R.string.ok)
+ .onPositive((dialog, which) -> {
+ createShortcut();
+ finish();
+ })
+ .cancelListener(dialog -> finish())
+ .show();
+ }
+
+
+ @OnClick(R.id.select_icon)
+ void selectIcon() {
+ ShortcutIconSelectActivity_.intent(this)
+ .startForResult(21209);
+ }
+
+
+ private void createShortcut() {
+ Shortcut shortcut = new Shortcut(this);
+ if (mIsDefaultIcon) {
+ shortcut.iconRes(R.drawable.ic_node_js_black);
+ } else {
+ Bitmap bitmap = BitmapTool.drawableToBitmap(mIcon.getDrawable());
+ shortcut.icon(bitmap);
+ }
+ shortcut.name(mName.getText().toString())
+ .targetClass(ShortcutActivity.class)
+ .extras(new Intent().putExtra(CommonUtils.EXTRA_KEY_PATH, mScriptFile.getPath()))
+ .send();
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (resultCode != RESULT_OK) {
+ return;
+ }
+ String packageName = data.getStringExtra(ShortcutIconSelectActivity.EXTRA_PACKAGE_NAME);
+ if (packageName != null) {
+ try {
+ mIcon.setImageDrawable(getPackageManager().getApplicationIcon(packageName));
+ mIsDefaultIcon = false;
+ } catch (PackageManager.NameNotFoundException e) {
+ e.printStackTrace();
+ }
+ return;
+ }
+ Observable.fromCallable(() -> BitmapFactory.decodeStream(getContentResolver().openInputStream(data.getData())))
+ .subscribeOn(Schedulers.computation())
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe((bitmap -> {
+ mIcon.setImageBitmap(bitmap);
+ mIsDefaultIcon = false;
+ }), error -> {
+ Log.e(LOG_TAG, "decode stream", error);
+ });
+
+ }
+}
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/shortcut/ShortcutIconSelectActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/shortcut/ShortcutIconSelectActivity.java
new file mode 100644
index 00000000..ff6b5b9d
--- /dev/null
+++ b/app/src/main/java/com/stardust/scriptdroid/ui/shortcut/ShortcutIconSelectActivity.java
@@ -0,0 +1,140 @@
+package com.stardust.scriptdroid.ui.shortcut;
+
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+import android.support.v7.widget.GridLayoutManager;
+import android.support.v7.widget.RecyclerView;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+
+import com.stardust.scriptdroid.R;
+import com.stardust.scriptdroid.ui.BaseActivity;
+
+import org.androidannotations.annotations.AfterViews;
+import org.androidannotations.annotations.EActivity;
+import org.androidannotations.annotations.ViewById;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import io.reactivex.Observable;
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * Created by Stardust on 2017/10/25.
+ */
+@EActivity(R.layout.activity_shortcut_icon_select)
+public class ShortcutIconSelectActivity extends BaseActivity {
+
+ public static final String EXTRA_PACKAGE_NAME = "extra_package_name";
+
+ @ViewById(R.id.apps)
+ RecyclerView mApps;
+
+ private PackageManager mPackageManager;
+ private List mAppList = new ArrayList<>();
+
+ @AfterViews
+ void setupViews() {
+ mPackageManager = getPackageManager();
+ setToolbarAsBack(getString(R.string.text_select_icon));
+ setupApps();
+ }
+
+ private void setupApps() {
+ mApps.setAdapter(new AppsAdapter());
+ mApps.setLayoutManager(new GridLayoutManager(this, 5));
+ loadApps();
+ }
+
+ private void loadApps() {
+ List packages = mPackageManager.getInstalledApplications(PackageManager.GET_META_DATA);
+ Observable.fromIterable(packages)
+ .observeOn(Schedulers.computation())
+ .filter(appInfo -> appInfo.icon != 0)
+ .map(AppItem::new)
+ .observeOn(AndroidSchedulers.mainThread())
+ .subscribe(icon -> {
+ mAppList.add(icon);
+ mApps.getAdapter().notifyItemInserted(mAppList.size() - 1);
+ });
+
+ }
+
+ private void selectApp(AppItem appItem) {
+ setResult(RESULT_OK, new Intent()
+ .putExtra(EXTRA_PACKAGE_NAME, appItem.info.packageName));
+ finish();
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.menu_shortcut_icon_select, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ startActivityForResult(new Intent(Intent.ACTION_GET_CONTENT)
+ .setType("image/*"), 11209);
+ return true;
+ }
+
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (resultCode == RESULT_OK) {
+ setResult(RESULT_OK, data);
+ finish();
+ }
+ }
+
+ private class AppItem {
+ Drawable icon;
+ ApplicationInfo info;
+
+ public AppItem(ApplicationInfo info) {
+ this.info = info;
+ icon = info.loadIcon(mPackageManager);
+ }
+ }
+
+ private class AppIconViewHolder extends RecyclerView.ViewHolder {
+
+ ImageView icon;
+
+ public AppIconViewHolder(View itemView) {
+ super(itemView);
+ icon = (ImageView) itemView;
+ icon.setOnClickListener(v -> selectApp(mAppList.get(getAdapterPosition())));
+ }
+ }
+
+
+ private class AppsAdapter extends RecyclerView.Adapter {
+
+ @Override
+ public AppIconViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ return new AppIconViewHolder(LayoutInflater.from(parent.getContext())
+ .inflate(R.layout.app_icon_list_item, parent, false));
+ }
+
+ @Override
+ public void onBindViewHolder(AppIconViewHolder holder, int position) {
+ holder.icon.setImageDrawable(mAppList.get(position).icon);
+ }
+
+ @Override
+ public int getItemCount() {
+ return mAppList.size();
+ }
+ }
+
+
+}
diff --git a/app/src/main/java/com/stardust/widget/SearchViewItem.java b/app/src/main/java/com/stardust/widget/SearchViewItem.java
index fb1fc0fa..a95acd4b 100644
--- a/app/src/main/java/com/stardust/widget/SearchViewItem.java
+++ b/app/src/main/java/com/stardust/widget/SearchViewItem.java
@@ -69,4 +69,10 @@ public class SearchViewItem implements MenuItemCompat.OnActionExpandListener, Se
public boolean onQueryTextChange(String newText) {
return false;
}
+
+
+ public void collapse() {
+ mSearchMenuItem.collapseActionView();
+ }
+
}
diff --git a/app/src/main/res/drawable-xhdpi/ic_insert_photo_white_48dp.png b/app/src/main/res/drawable-xhdpi/ic_insert_photo_white_48dp.png
new file mode 100644
index 0000000000000000000000000000000000000000..9b88f9358e9db2e1ff963f5992b8679655a7c991
GIT binary patch
literal 1725
zcmcgsYgm$Z6vwBfQxnHDO(#|YWs$Q-vJDHJcm?JKCpDe7GIEMk3TC3vw$`+%)bLg)
zI8$;u(@ebPWocfv0O@63X}Ypr_O59;7&%|7;lAxt-}Zl=^FQZ2zwMdW
zR?b!k1j2?A8W?5r@^yRD-1L)_=3XXec`7u9gFqnfteaUG9{COeVSbVl=pTKiYVnux
zLI%@ibb0*n>hScA!VX#G;0)u|Au4?v`zm?W%)d0r&mpLN6PI!J1N+j;rA}S@9Uu5b
zc2jGxRdo!J`Lzb3J~bn_s(I=_wu+?lorhNh9$8g7juc*2OzF?0U`-3W{*B?O79U${
zE3xbfc@WTBmy7)+c3(9AWf?aX$e@H^`Dm1Nklpp$AKK3vgDG1nyjY-TFyq92ng~hd
zdAbSk=;PjyH5SZ_34pL*rICAy9yPz1KH!;J?ancOg5#&c62L#0lAE8<
zPk4%#YzXLk3kB2ix9ninRHT5_cO=B`2XM-eI}L!pITKCvwP&jS2={KG`#?+TyBEQ5
z_os>b_myMWKN%lkl2beIDetb$`*^o7b~_ce$+(CjHVZhG-12Q%FFHIn~V
zNDs#Wj(FB7-80S$?@bq(+_7i$eJc;oAz$
zkZd(`yKD>5_b{jPK5^LldEgy9>qUSQ2&H2}8uvymlV5!YZcC;Eog&xDL2(F<a(lre
zTFLx}=_fn*{R>T)EWXXe6|nFKT(@YG46b(7dOME9w>^H@cb~3mHDsYDEqS_$TMdgK4m^
z+4!jqF}J$Do*zc2*S&b9F}^@Q&f_S&$EW9}hs7QoqfbOdPxF;~3v-^cf}0CX)lD}+
z(IPv(dB!cdMbG__RcXm*_b%G<#(0H`7|i7TiND0`uF;$xL%VEh^jdDwP>JQACvNbM
zj*0tRr1Hm75CW#k5^Qq?0Lk^(o)m%Fn24W@yTQ+{W_3JpT}Mk3M&Z6|CLYJ{0r=x+
zG%{lLl&zi%v8XL~m8T0$K-&NlZclCQKD2a3`YxXYWwqav{`#!$^wKF)>H%fR$L+RC
ze^#ND8d*znWMk)esHAt}le6<=>!I%2=a@eongsFBRd$;kQI1#=9wI|~7?scPNxJ-<
z?fNfGlh&ZH8=ZYa{zt?GK3#Shaj-O)*rBV@hD
zk(AL^z|5Sv$M6kcwzq@Z!f5=+m6EBK6bl%tf%LB9bl_US`wX8kDnxBttJd3=t3GG&
zORg)T1`o)wGyM_DypDdZ!=|io04!MP<6iPNiId14H9(oA`&gX#ZK8--E^>$!xjn>F
zo|?E%dQG=jip;?53K5p2`*}hiQL@WbnI#A6K~+_UBI@A*0|V8XXp-FxX>$|BP;99@
z5y&%o(FmvV6H@=)TByab8TuF4r84d(_agu5ZUWzUc3G@bSa|s=UoY*ZiqB#UTitPm
Uvu4|B8`cSwpzy$Ea?%(70J69=fB*mh
literal 0
HcmV?d00001
diff --git a/app/src/main/res/drawable/shortcut_create_dialog_icon_bg.xml b/app/src/main/res/drawable/shortcut_create_dialog_icon_bg.xml
new file mode 100644
index 00000000..1db04984
--- /dev/null
+++ b/app/src/main/res/drawable/shortcut_create_dialog_icon_bg.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_shortcut_icon_select.xml b/app/src/main/res/layout/activity_shortcut_icon_select.xml
new file mode 100644
index 00000000..210f9c7f
--- /dev/null
+++ b/app/src/main/res/layout/activity_shortcut_icon_select.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/app_icon_list_item.xml b/app/src/main/res/layout/app_icon_list_item.xml
new file mode 100644
index 00000000..7e510238
--- /dev/null
+++ b/app/src/main/res/layout/app_icon_list_item.xml
@@ -0,0 +1,8 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/shortcut_create_dialog.xml b/app/src/main/res/layout/shortcut_create_dialog.xml
new file mode 100644
index 00000000..dad0c0af
--- /dev/null
+++ b/app/src/main/res/layout/shortcut_create_dialog.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_script_options.xml b/app/src/main/res/menu/menu_script_options.xml
index b4176a5d..3b23c9d5 100644
--- a/app/src/main/res/menu/menu_script_options.xml
+++ b/app/src/main/res/menu/menu_script_options.xml
@@ -12,6 +12,9 @@
+
-
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 399a7a07..7c34336c 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -45,7 +45,7 @@
开始运行
用其他应用打开
重命名
- 创建桌面快捷方式
+ 创建快捷方式
已创建
删除
已删除
@@ -263,6 +263,8 @@
清理临时文件
脚本文件路径
搜索
+ 悬浮编辑
+ 选择图标