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 @@ 清理临时文件 脚本文件路径 搜索 + 悬浮编辑 + 选择图标