From 54146aa581a003e7d88f83eceeb01fa08c6be764 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Wed, 10 Oct 2018 15:26:48 +0800 Subject: [PATCH] feat(ui): project icon setting --- .../autojs/ui/project/BuildActivity.java | 26 ++---- .../ui/project/ProjectConfigActivity.java | 84 ++++++++++++++++++- .../shortcut/ShortcutIconSelectActivity.java | 22 +++++ .../res/layout/activity_project_config.xml | 1 - 4 files changed, 109 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java b/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java index 2eadd7f1..06e130cf 100644 --- a/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/project/BuildActivity.java @@ -53,6 +53,8 @@ import io.reactivex.schedulers.Schedulers; @EActivity(R.layout.activity_build) public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.ProgressCallback { + private static final int REQUEST_CODE = 44401; + public static final String EXTRA_SOURCE = BuildActivity.class.getName() + ".extra_source_file"; private static final String LOG_TAG = "BuildActivity"; @@ -194,7 +196,7 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog @Click(R.id.icon) void selectIcon() { ShortcutIconSelectActivity_.intent(this) - .startForResult(31209); + .startForResult(REQUEST_CODE); } @Click(R.id.fab) @@ -333,27 +335,13 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog 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; - } - if (data.getData() == null) - return; - Observable.fromCallable(() -> BitmapFactory.decodeStream(getContentResolver().openInputStream(data.getData()))) - .subscribeOn(Schedulers.computation()) + ShortcutIconSelectActivity.getBitmapFromIntent(getApplicationContext(), data) + .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe((bitmap -> { + .subscribe(bitmap -> { mIcon.setImageBitmap(bitmap); mIsDefaultIcon = false; - }), error -> { - Log.e(LOG_TAG, "decode stream", error); - }); + }, Throwable::printStackTrace); } diff --git a/app/src/main/java/org/autojs/autojs/ui/project/ProjectConfigActivity.java b/app/src/main/java/org/autojs/autojs/ui/project/ProjectConfigActivity.java index 3950d0f6..d6b834d4 100644 --- a/app/src/main/java/org/autojs/autojs/ui/project/ProjectConfigActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/project/ProjectConfigActivity.java @@ -1,6 +1,8 @@ package org.autojs.autojs.ui.project; import android.annotation.SuppressLint; +import android.content.Intent; +import android.graphics.Bitmap; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.design.widget.TextInputEditText; @@ -12,7 +14,6 @@ import android.widget.ImageView; import android.widget.Toast; import com.stardust.autojs.project.ProjectConfig; -import com.stardust.autojs.runtime.api.Dialogs; import com.stardust.pio.PFiles; import org.androidannotations.annotations.AfterViews; @@ -22,14 +23,18 @@ import org.androidannotations.annotations.ViewById; import org.autojs.autojs.R; import org.autojs.autojs.model.explorer.ExplorerDirPage; import org.autojs.autojs.model.explorer.ExplorerFileItem; -import org.autojs.autojs.model.explorer.ExplorerItem; import org.autojs.autojs.model.explorer.Explorers; import org.autojs.autojs.model.project.ProjectTemplate; +import org.autojs.autojs.network.GlideApp; import org.autojs.autojs.theme.dialog.ThemeColorMaterialDialogBuilder; import org.autojs.autojs.ui.BaseActivity; +import org.autojs.autojs.ui.shortcut.ShortcutIconSelectActivity; +import org.autojs.autojs.ui.shortcut.ShortcutIconSelectActivity_; import org.autojs.autojs.ui.widget.SimpleTextWatcher; import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -44,6 +49,8 @@ public class ProjectConfigActivity extends BaseActivity { public static final String EXTRA_DIRECTORY = "directory"; + private static final int REQUEST_CODE = 12477; + @ViewById(R.id.project_location) EditText mProjectLocation; @@ -70,6 +77,7 @@ public class ProjectConfigActivity extends BaseActivity { private File mParentDirectory; private ProjectConfig mProjectConfig; private boolean mNewProject; + private Bitmap mIconBitmap; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -118,6 +126,12 @@ public class ProjectConfigActivity extends BaseActivity { mVersionName.setText(mProjectConfig.getVersionName()); mMainFileName.setText(mProjectConfig.getMainScriptFile()); mProjectLocation.setVisibility(View.GONE); + String icon = mProjectConfig.getIcon(); + if (icon != null) { + GlideApp.with(this) + .load(new File(mDirectory, icon)) + .into(mIcon); + } } } @@ -128,9 +142,22 @@ public class ProjectConfigActivity extends BaseActivity { if (!checkInputs()) { return; } + if (mIconBitmap != null) { + saveIcon(mIconBitmap) + .subscribe(ignored -> saveProjectConfig(), e -> { + e.printStackTrace(); + Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show(); + }); + } else { + saveProjectConfig(); + } + + } + + @SuppressLint("CheckResult") + private void saveProjectConfig() { if (mNewProject) { - String location = mProjectLocation.getText().toString(); - new ProjectTemplate(mProjectConfig, new File(location)) + new ProjectTemplate(mProjectConfig, mDirectory) .newProject() .subscribe(ignored -> { Explorers.workspace().notifyChildrenChanged(new ExplorerDirPage(mParentDirectory, null)); @@ -158,12 +185,22 @@ public class ProjectConfigActivity extends BaseActivity { } } + @Click(R.id.icon) + void selectIcon() { + ShortcutIconSelectActivity_.intent(this) + .startForResult(REQUEST_CODE); + } + private void syncProjectConfig() { mProjectConfig.setName(mAppName.getText().toString()); mProjectConfig.setVersionCode(Integer.parseInt(mVersionCode.getText().toString())); mProjectConfig.setVersionName(mVersionName.getText().toString()); mProjectConfig.setMainScriptFile(mMainFileName.getText().toString()); mProjectConfig.setPackageName(mPackageName.getText().toString()); + if (mNewProject) { + String location = mProjectLocation.getText().toString(); + mDirectory = new File(location); + } //mProjectConfig.getLaunchConfig().setHideLogs(true); } @@ -184,4 +221,43 @@ public class ProjectConfigActivity extends BaseActivity { editText.setError(hint + getString(R.string.text_should_not_be_empty)); return false; } + + + @SuppressLint("CheckResult") + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (resultCode != RESULT_OK) { + return; + } + ShortcutIconSelectActivity.getBitmapFromIntent(getApplicationContext(), data) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(bitmap -> { + mIcon.setImageBitmap(bitmap); + mIconBitmap = bitmap; + }, + Throwable::printStackTrace); + } + + @SuppressLint("CheckResult") + private Observable saveIcon(Bitmap b) { + return Observable.just(b) + .map(bitmap -> { + String iconPath = mProjectConfig.getIcon(); + if (iconPath == null) { + iconPath = "res/logo.png"; + } + File iconFile = new File(mDirectory, iconPath); + PFiles.ensureDir(iconFile.getPath()); + FileOutputStream fos = new FileOutputStream(iconFile); + bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); + fos.close(); + return iconPath; + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .doOnNext(iconPath -> mProjectConfig.setIcon(iconPath)); + + } + } diff --git a/app/src/main/java/org/autojs/autojs/ui/shortcut/ShortcutIconSelectActivity.java b/app/src/main/java/org/autojs/autojs/ui/shortcut/ShortcutIconSelectActivity.java index 0cb1968f..fb0521ee 100644 --- a/app/src/main/java/org/autojs/autojs/ui/shortcut/ShortcutIconSelectActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/shortcut/ShortcutIconSelectActivity.java @@ -5,7 +5,10 @@ import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ShortcutManager; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; +import android.net.Uri; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; @@ -16,6 +19,7 @@ import android.view.ViewGroup; import android.widget.ImageView; import org.autojs.autojs.R; +import org.autojs.autojs.tool.BitmapTool; import org.autojs.autojs.ui.BaseActivity; import org.androidannotations.annotations.AfterViews; @@ -24,6 +28,7 @@ import org.androidannotations.annotations.ViewById; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.Callable; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -97,6 +102,23 @@ public class ShortcutIconSelectActivity extends BaseActivity { } } + public static Observable getBitmapFromIntent(Context context, Intent data) { + String packageName = data.getStringExtra(EXTRA_PACKAGE_NAME); + if (packageName != null) { + return Observable.fromCallable(() -> { + Drawable drawable = context.getPackageManager().getApplicationIcon(packageName); + return BitmapTool.drawableToBitmap(drawable); + }); + } + Uri uri = data.getData(); + if (uri == null) { + return Observable.error(new IllegalArgumentException("invalid intent")); + } + return Observable.fromCallable(() -> + BitmapFactory.decodeStream(context.getContentResolver().openInputStream(uri)) + ); + } + private class AppItem { Drawable icon; ApplicationInfo info; diff --git a/app/src/main/res/layout/activity_project_config.xml b/app/src/main/res/layout/activity_project_config.xml index ff2e777d..80f0990e 100644 --- a/app/src/main/res/layout/activity_project_config.xml +++ b/app/src/main/res/layout/activity_project_config.xml @@ -88,7 +88,6 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" - android:showDividers="" android:orientation="vertical">